"""
环境变量配置管理

集中管理所有环境变量，提供统一的配置读取入口。
所有配置项按功能域分组，支持类型转换和默认值设置。
"""
import logging
import os
from dotenv import load_dotenv

logger = logging.getLogger(__name__)

# 加载 .env 文件（支持通过 ENV_FILE 环境变量指定不同环境配置）
import pathlib

# 1. 首先尝试从系统环境变量获取 ENV_FILE
# 2. 如果没有设置，使用默认的 .env 文件
_env_file = os.environ.get('ENV_FILE', '.env')
_env_path = pathlib.Path(__file__).parent.parent / _env_file

# 加载指定的 .env 文件（如果存在）
if _env_path.exists():
    load_dotenv(_env_path)
    logger.info(f"Loaded environment from: {_env_path}")
else:
    # 如果指定的文件不存在，回退到默认 .env
    _default_env_path = pathlib.Path(__file__).parent.parent / '.env'
    if _default_env_path.exists():
        load_dotenv(_default_env_path)
        logger.info(f"ENV_FILE '{_env_file}' not found, loaded default: {_default_env_path}")
    else:
        logger.warning(f"No .env file found at {_env_path} or {_default_env_path}")

# ==================== 基础配置 ====================
# Flask 应用配置
SECRET_KEY = os.environ.get('SECRET_KEY', 'default-dev-key-change-in-production')
FLASK_ENV = os.environ.get('FLASK_ENV', 'development')
LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO').upper()
HTML_TITLE = os.environ.get('HTML_TITLE', '智能（会议）文秘')

# Session Cookie 配置
SESSION_COOKIE_SECURE = os.environ.get('SESSION_COOKIE_SECURE', 'false').lower() == 'true'
SESSION_COOKIE_HTTPONLY = os.environ.get('SESSION_COOKIE_HTTPONLY', 'true').lower() == 'true'
SESSION_COOKIE_SAMESITE = os.environ.get('SESSION_COOKIE_SAMESITE', 'Lax')

# 文件上传配置
UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', '/data/uploads')
MAX_FILE_SIZE_MB = int(os.environ.get('MAX_FILE_SIZE_MB', '250'))

# ==================== ASR 配置 ====================
# 是否使用外部 ASR 服务
USE_ASR_ENDPOINT = os.environ.get('USE_ASR_ENDPOINT', 'false').lower() == 'true'

# 声纹服务配置
ASR_BASE_URL = os.environ.get('ASR_BASE_URL', '').split('#')[0].strip()

# 说话人分离配置
ASR_DIARIZE = os.environ.get('ASR_DIARIZE', 'false').lower() == 'true'
ASR_MIN_SPEAKERS = int(os.environ.get('ASR_MIN_SPEAKERS', '1'))
ASR_MAX_SPEAKERS = int(os.environ.get('ASR_MAX_SPEAKERS', '10'))

# ==================== LLM 配置 ====================
# 文本模型配置
TEXT_MODEL_BASE_URL = os.environ.get('TEXT_MODEL_BASE_URL', 'https://openrouter.ai/api/v1').split('#')[0].strip()
TEXT_MODEL_NAME = os.environ.get('TEXT_MODEL_NAME', 'openai/gpt-3.5-turbo')
TEXT_MODEL_API_KEY = os.environ.get('TEXT_MODEL_API_KEY', '')

# Token 限制配置
MAX_TOKENS_FOR_TRANSCRIPTION = int(os.environ.get('MAX_TOKENS_FOR_TRANSCRIPTION', '10000'))
SPEAKR_TOKENS_FOR_TRANSCRIPTION = int(os.environ.get('SPEAKR_TOKENS_FOR_TRANSCRIPTION', '1000'))

# ==================== 音频分段配置 ====================
ENABLE_CHUNKING = os.environ.get('ENABLE_CHUNKING', 'false').lower() == 'true'

# ==================== Inquire 配置 ====================
ENABLE_INQUIRE_MODE = os.environ.get('ENABLE_INQUIRE_MODE', 'false').lower() == 'true'

# ==================== 数据库配置 ====================
SQLALCHEMY_DATABASE_URI = os.environ.get(
    'SQLALCHEMY_DATABASE_URI',
    'sqlite:///data/instance/transcriptions.db'
)

# 数据库连接池配置（仅 PostgreSQL 生效）
DB_POOL_SIZE = int(os.environ.get('DB_POOL_SIZE', '10'))
DB_MAX_OVERFLOW = int(os.environ.get('DB_MAX_OVERFLOW', '20'))
DB_POOL_TIMEOUT = int(os.environ.get('DB_POOL_TIMEOUT', '30'))
DB_POOL_RECYCLE = int(os.environ.get('DB_POOL_RECYCLE', '3600'))

# ==================== 外部 API 配置 ====================
TRANSCRIPTION_BASE_URL = os.environ.get('TRANSCRIPTION_BASE_URL', 'https://api.openai.com/v1')
TRANSCRIPTION_API_KEY = os.environ.get('TRANSCRIPTION_API_KEY', '')
VALID_TOKEN = os.environ.get('VALID_TOKEN', 'speakr_auth_token_2024_secret_key_12345')

# ==================== WebSocket 配置 ====================
# FunASR WebSocket 服务地址（用于实时语音识别）
FUNASR_WEBSOCKET_IP = os.environ.get('FUNASR_WEBSOCKET_IP', 'localhost:8083')

# 大屏推送服务地址
SCREEN_PUSH_IP = os.environ.get('SCREEN_PUSH_IP', '172.18.30.221:8083')

# ==================== 自动处理配置 ====================
ENABLE_AUTO_PROCESSING = os.environ.get('ENABLE_AUTO_PROCESSING', 'false').lower() == 'true'
AUTO_PROCESS_WATCH_DIR = os.environ.get('AUTO_PROCESS_WATCH_DIR', '/data/auto-process')
AUTO_PROCESS_CHECK_INTERVAL = int(os.environ.get('AUTO_PROCESS_CHECK_INTERVAL', '30'))
AUTO_PROCESS_MODE = os.environ.get('AUTO_PROCESS_MODE', 'admin_only')
AUTO_PROCESS_DEFAULT_USERNAME = os.environ.get('AUTO_PROCESS_DEFAULT_USERNAME')

# ==================== 代理配置 ====================
HTTP_PROXY = os.environ.get('HTTP_PROXY', '')
HTTPS_PROXY = os.environ.get('HTTPS_PROXY', '')
NO_PROXY = os.environ.get('NO_PROXY', '')

# ==================== 配置验证 ====================
def validate_config():
    """验证必要的配置项是否已设置"""
    warnings = []
    
    if not SECRET_KEY or SECRET_KEY == 'default-dev-key-change-in-production':
        warnings.append('警告：使用默认 SECRET_KEY，生产环境请务必设置环境变量')
    
    if USE_ASR_ENDPOINT and not ASR_BASE_URL:
        warnings.append('警告：已启用 ASR_ENDPOINT 但未设置 ASR_BASE_URL')
    
    if TEXT_MODEL_BASE_URL and 'openrouter' in TEXT_MODEL_BASE_URL.lower() and not TEXT_MODEL_API_KEY:
        warnings.append('警告：使用 OpenRouter 但未设置 TEXT_MODEL_API_KEY')
    
    return warnings


def get_app_config():
    """
    获取所有需要写入 Flask app.config 的配置项
    （不含 chunking_service 和 EMBEDDINGS_AVAILABLE，这两项由 app.py 初始化后手动注入）
    
    Returns:
        dict: 配置字典，可直接传给 app.config.from_mapping()
    """
    return {
        # 基础配置
        'SECRET_KEY': SECRET_KEY,
        'UPLOAD_FOLDER': UPLOAD_FOLDER,
        'LOG_LEVEL': LOG_LEVEL,
        'HTML_TITLE': HTML_TITLE,
        'MAX_FILE_SIZE_MB': MAX_FILE_SIZE_MB,
        # Session Cookie 配置
        'SESSION_COOKIE_SECURE': SESSION_COOKIE_SECURE,
        'SESSION_COOKIE_HTTPONLY': SESSION_COOKIE_HTTPONLY,
        'SESSION_COOKIE_SAMESITE': SESSION_COOKIE_SAMESITE,
        # ASR 配置
        'USE_ASR_ENDPOINT': USE_ASR_ENDPOINT,
        'ASR_BASE_URL': ASR_BASE_URL,
        'ASR_DIARIZE': ASR_DIARIZE,
        'ASR_MIN_SPEAKERS': ASR_MIN_SPEAKERS,
        'ASR_MAX_SPEAKERS': ASR_MAX_SPEAKERS,
        # LLM 配置
        'TEXT_MODEL_BASE_URL': TEXT_MODEL_BASE_URL,
        'TEXT_MODEL_NAME': TEXT_MODEL_NAME,
        'TEXT_MODEL_API_KEY': TEXT_MODEL_API_KEY,
        # Token 限制
        'MAX_TOKENS_FOR_TRANSCRIPTION': MAX_TOKENS_FOR_TRANSCRIPTION,
        'SPEAKR_TOKENS_FOR_TRANSCRIPTION': SPEAKR_TOKENS_FOR_TRANSCRIPTION,
        # 转录配置
        'TRANSCRIPTION_BASE_URL': TRANSCRIPTION_BASE_URL,
        'TRANSCRIPTION_API_KEY': TRANSCRIPTION_API_KEY,
        'VALID_TOKEN': VALID_TOKEN,
        # 功能开关
        'ENABLE_CHUNKING': ENABLE_CHUNKING,
        'ENABLE_INQUIRE_MODE': ENABLE_INQUIRE_MODE,
        # 自动处理配置
        'ENABLE_AUTO_PROCESSING': ENABLE_AUTO_PROCESSING,
        'AUTO_PROCESS_WATCH_DIR': AUTO_PROCESS_WATCH_DIR,
        'AUTO_PROCESS_CHECK_INTERVAL': AUTO_PROCESS_CHECK_INTERVAL,
        'AUTO_PROCESS_MODE': AUTO_PROCESS_MODE,
        'AUTO_PROCESS_DEFAULT_USERNAME': AUTO_PROCESS_DEFAULT_USERNAME,
        # 代理配置
        'HTTP_PROXY': HTTP_PROXY,
        'HTTPS_PROXY': HTTPS_PROXY,
        'NO_PROXY': NO_PROXY,
        # WebSocket 配置
        'FUNASR_WEBSOCKET_IP': FUNASR_WEBSOCKET_IP,
        'SCREEN_PUSH_IP': SCREEN_PUSH_IP,
        # 数据库配置
        'SQLALCHEMY_DATABASE_URI': SQLALCHEMY_DATABASE_URI,
    }


# 启动时打印配置警告（使用 logging 以便被日志系统捕获）
_config_warnings = validate_config()
for warning in _config_warnings:
    logger.warning(warning)
