import os
from dotenv import load_dotenv

load_dotenv()

class Settings:
    PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    MODEL_CONFIG = {
        "deepseek": {
            "name": "deepseek-v4-flash",
            "base_url": os.getenv("DEEPSEEK_BASE_URL", "https://llm-api.atomgit.com/v1"),
            "api_key": os.getenv("DEEPSEEK_API_KEY", ""),
            "model_name": os.getenv("DEEPSEEK_MODEL_NAME", "deepseek-v4-flash")
        },
        "glm": {
            "name": "GLM-5.2",
            "base_url": os.getenv("GLM_BASE_URL", "https://llm-api.atomgit.com/v1"),
            "api_key": os.getenv("GLM_API_KEY", ""),
            "model_name": os.getenv("GLM_MODEL_NAME", "GLM-5.2")
        },
        "qwen": {
            "name": "Qwen3",
            "base_url": os.getenv("QWEN_BASE_URL", "https://llm-api.atomgit.com/v1"),
            "api_key": os.getenv("QWEN_API_KEY", ""),
            "model_name": os.getenv("QWEN_MODEL_NAME", "Qwen/Qwen3-VL-8B-Instruct")
        },
        # ModelArts 昇腾 AI 推理服务(华为云 ModelArts ModelEndpoint)
        # direct_endpoint=True:端点已是完整 URL,仅追加 /chat/completions
        # auth_header: ModelArts 使用 X-Auth-Token 认证头(可选,默认 Bearer)
        "modelarts": {
            "name": "ModelArts-Qwen3",
            "base_url": os.getenv("MODELARTS_ENDPOINT", ""),
            "api_key": os.getenv("MODELARTS_API_KEY", ""),
            "model_name": os.getenv("MODELARTS_MODEL_NAME", "Qwen3-8B"),
            "direct_endpoint": True,
            "auth_type": os.getenv("MODELARTS_AUTH_TYPE", "bearer"),  # bearer / x-auth-token
        }
    }
    
    CURRENT_MODEL = os.getenv("CURRENT_MODEL", "deepseek")
    
    DATA_DIR = os.path.join(PROJECT_ROOT, "data")
    TEST_REPORTS_DIR = os.path.join(DATA_DIR, "test_reports")
    RULES_DIR = os.path.join(DATA_DIR, "rules")
    # [Phase 2 新增] CAS 准则 JSON 目录
    STANDARDS_DIR = os.path.join(DATA_DIR, "standards")
    
    CACHE_ENABLED = os.getenv("CACHE_ENABLED", "true").lower() == "true"
    REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/0")

    # [Phase 2 新增] 证据溯源配置(默认关闭 · 开关 + try-except 双保险)
    EVIDENCE_TRACING = {
        # 总开关。默认关闭(演示模式下 demo_cache 会强制开启生成,运行时断网可用缓存)
        "enabled": os.getenv("EVIDENCE_TRACING_ENABLED", "false").lower() == "true",
        # 每个红旗最多展示的证据条目数
        "max_evidences_per_flag": int(os.getenv("EVIDENCE_MAX_EVIDENCES", "3")),
        # 证据片段最大字符数(原文截断,长度限制不等于匿名化)
        "snippet_max_chars": int(os.getenv("EVIDENCE_SNIPPET_MAX_CHARS", "200")),
        # rapidfuzz 模糊匹配阈值(0-100,低于60不展示)
        "fuzz_threshold": int(os.getenv("EVIDENCE_FUZZ_THRESHOLD", "60")),
        # (预留,默认关)用昇腾LLM对证据片段做更精准的证据归类
        "llm_enrichment_enabled": os.getenv("EVIDENCE_LLM_ENRICHMENT", "false").lower() == "true",
    }

    # [Phase 3A 预留] 人在回路(HITL)三可合规配置(默认全关 · 本期仅占位,代码 Phase 3A 实装时启用)
    # 合规基线:金监总局「金发〔2026〕8号」第16/17/22条
    HITL_WORKFLOW = {
        # 总开关。默认关闭(关闭时,Tab2 不显示状态徽章/操作按钮,系统永不创建 audit_log.db)
        "enabled": os.getenv("HITL_ENABLED", "false").lower() == "true",
        # SQLite 审计日志路径(绝对/相对均可,默认 data/hitl_audit/ 目录)
        "audit_db_path": os.getenv("HITL_AUDIT_DB",
                                   os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
                                                "data", "hitl_audit", "audit_log.db")),
        # 审计日志启用 SQLCipher 级别的列族加密(生产部署必填,Demo 模式可关)
        "db_encryption_enabled": os.getenv("HITL_DB_ENCRYPTION", "false").lower() == "true",
        # 整份报告自动提复核触发条件:Hybrid 风险等级 ∈ {'高风险','中风险'} 或 红旗触发数 ≥ 1
        # 合规要求:只要有触发红旗(≥1),就必须走 HITL 流程(金发〔2026〕8号 第17条)
        "auto_promote_min_flags": int(os.getenv("HITL_AUTO_PROMOTE_MIN_FLAGS", "1")),
        "auto_promote_hybrid_levels": os.getenv("HITL_AUTO_PROMOTE_LEVELS", "高风险,中风险").split(","),
        # 取消/回滚时是否保留完整状态快照(=true 合规要求,不可改为 false)
        "retain_full_snapshot": True,
        # 操作理由最低字数(与 UI 层 MIN_REASON_LOCKED 对齐:CONFIRM≥50 / REJECT≥50 / APPEAL≥80 / ROLLBACK≥50)
        # 后端是最终防线,不得低于 UI 阈值(低则任何人可绕过 UI 直接调 workflow.transition)
        "min_reason_chars": {
            "AUTO_PROMOTE": 5, "CONFIRM": 50, "REJECT": 50, "APPEAL": 80,
            "CANCEL": 20, "ROLLBACK": 50, "ARBITRATE": 30,
        },
        # 真实任务的风控委联签名册。未配置时 ARBITRATE 失败关闭;
        # 逗号分隔企业域账号,例如 RC001,RC002,RC003。
        "committee_member_ids": {
            item.strip()
            for item in os.getenv("HITL_COMMITTEE_MEMBER_IDS", "").split(",")
            if item.strip()
        },
        # (Phase 3B 预留,默认关)连续驳回触发红旗规则停用审查
        "phase3b_rule_review_enabled": False,
        "phase3b_reject_rate_threshold": float(os.getenv("HITL_3B_REJECT_RATE", "0.6")),   # ≥60%
        "phase3b_min_window_size":    int(os.getenv("HITL_3B_WINDOW_SIZE", "30")),         # 连续30条
    }

    # scan-corrector PDF 扫描件矫正配置(三层熔断保护)
    SCAN_CORRECTOR = {
        # 第1层:总开关。默认关闭(仅在确定是扫描件/歪的PDF时手动开启)
        "enabled": os.getenv("SCAN_CORRECTOR_ENABLED", "false").lower() == "true",
        # 第2层:文件大小阈值(MB)。超过此大小的 PDF 直接跳过矫正(绝大多数扫描件 <2MB,
        # 真实巨潮下载的年报 3-10MB 不需要矫正)
        "max_file_size_mb": float(os.getenv("SCAN_CORRECTOR_MAX_MB", "3.0")),
        # 第3层:超时熔断(秒)。矫正超过此时间直接放弃并返回原始 PDF
        "timeout_seconds": int(os.getenv("SCAN_CORRECTOR_TIMEOUT", "10")),
        # 是否在矫正失败/超时时输出调试日志
        "debug_log": os.getenv("SCAN_CORRECTOR_DEBUG", "false").lower() == "true",
    }

    # 昇腾 API 配置(赛事合规刚需 · R-ASCEND-1)
    # provider 决定从 MODEL_CONFIG 读取 base_url/api_key/model_name
    LLM_ASCEND = {
        'enabled': os.getenv("LLM_ASCEND_ENABLED", "true").lower() == "true",
        'provider': os.getenv("LLM_ASCEND_PROVIDER", "glm"),
        'api_key': os.getenv("ATOMGIT_LLM_API_KEY", ""),
        'model_name': os.getenv("LLM_ASCEND_MODEL", ""),
        'timeout_seconds': int(os.getenv("LLM_ASCEND_TIMEOUT", "60")),
        'max_tokens': int(os.getenv("LLM_ASCEND_MAX_TOKENS", "512")),
        'temperature': float(os.getenv("LLM_ASCEND_TEMPERATURE", "0.3")),
        'top_p': float(os.getenv("LLM_ASCEND_TOP_P", "0.8")),
        # ModelArts 专用:是否为直接端点(跳过 base_url 拼接)
        'direct_endpoint': os.getenv("LLM_ASCEND_DIRECT_ENDPOINT", "false").lower() == "true",
        # ModelArts 认证方式:bearer(默认)/ x-auth-token
        'auth_type': os.getenv("LLM_ASCEND_AUTH_TYPE", "bearer"),
    }

    # Altman Z-Score 信贷风控阈值配置
    # 上市企业版阈值(Altman 1968)
    # 私有企业版阈值(Altman 1983,Z' Score)
    ALTMAN_Z_THRESHOLDS = {
        "listed": {
            "safe": 2.99,      # Z > 2.99:安全
            "grey": 1.81,      # 1.81 < Z <= 2.99:灰色区域
            "crisis": 1.81,    # Z <= 1.81:危机
        },
        "private": {
            "safe": 2.9,       # Z > 2.9:安全
            "grey": 1.23,      # 1.23 < Z <= 2.9:灰色区域
            "crisis": 1.23,    # Z <= 1.23:危机
        },
    }

settings = Settings()