# -*- coding: utf-8 -*-
"""
系统配置模型

包含系统配置相关模型
"""

from .base import db, get_beijing_now


class SystemConfig(db.Model):
    """系统配置模型"""
    __tablename__ = 'system_configs'

    id = db.Column(db.Integer, primary_key=True)
    key = db.Column(db.String(100), nullable=False)
    value = db.Column(db.Text, nullable=False)
    description = db.Column(db.String(200))
    category = db.Column(db.String(50), default='general')
    enabled = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, default=get_beijing_now)
    updated_at = db.Column(db.DateTime, default=get_beijing_now, onupdate=get_beijing_now)
    
    # 复合唯一约束：key + category
    __table_args__ = (
        db.UniqueConstraint('key', 'category', name='uq_config_key_category'),
    )

    def to_dict(self):
        return {
            'id': self.id,
            'key': self.key,
            'value': self.get_value(),
            'description': self.description,
            'category': self.category,
            'enabled': self.enabled,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }

    def get_value(self):
        """获取配置值（解析JSON）"""
        try:
            import json
            return json.loads(self.value)
        except:
            # 如果JSON解析失败，尝试解析布尔值
            if self.value.lower() in ['true', 'false']:
                return self.value.lower() == 'true'
            return self.value

    def set_value(self, value):
        """设置配置值（转换为JSON）"""
        import json
        if isinstance(value, bool):
            # 布尔值转换为JSON格式（小写的true/false）
            self.value = json.dumps(value)
        elif isinstance(value, (dict, list)):
            self.value = json.dumps(value, ensure_ascii=False)
        else:
            self.value = str(value)

    @staticmethod
    def get_config(key, default=None, category=None):
        """获取配置值
        
        Args:
            key: 配置键
            default: 默认值
            category: 配置类别（如 'ai'），如果为None则使用 'general'
        """
        if category is None:
            category = 'general'
        config = SystemConfig.query.filter_by(key=key, category=category, enabled=True).first()
        if config:
            return config.get_value()
        return default

    @staticmethod
    def set_config(key, value, description=None, category=None):
        """设置配置值
        
        Args:
            key: 配置键
            value: 配置值
            description: 描述
            category: 配置类别（如 'ai', 'general'），如果为None则使用 'general'
        """
        if category is None:
            category = 'general'
        
        # 使用复合唯一约束查询（key + category）
        config = SystemConfig.query.filter_by(key=key, category=category).first()
        if config:
            config.set_value(value)
            if description:
                config.description = description
        else:
            config = SystemConfig(
                key=key,
                value='',
                description=description,
                category=category
            )
            config.set_value(value)
            db.session.add(config)
        db.session.commit()
        return config

    @staticmethod
    def is_registration_enabled():
        """检查是否允许用户注册"""
        value = SystemConfig.get_config('allow_registration', True)
        if isinstance(value, bool):
            return value
        if isinstance(value, str):
            # 处理字符串形式的布尔值
            return value.lower() not in ['false', '0', 'no', 'off']
        return True  # 默认允许

    @staticmethod
    def has_global_token():
        """检查是否设置了全局Token（兼容方法，使用 ai_provider_configs）"""
        from .ai_provider import AIProviderConfig
        config = AIProviderConfig.query.filter_by(
            user_id=None,
            provider_type='augment',
            is_active=True,
            is_default=True
        ).first()
        if config:
            api_key = config.get_api_key()
            if api_key and api_key.strip():
                return True
        return False

    @staticmethod
    def get_global_token_info():
        """获取全局Token信息（不包含实际Token内容）（兼容方法，使用 ai_provider_configs）"""
        from .ai_provider import AIProviderConfig
        config = AIProviderConfig.query.filter_by(
            user_id=None,
            provider_type='augment',
            is_active=True,
            is_default=True
        ).first()
        if config:
            api_key = config.get_api_key()
            if api_key and api_key.strip():
                return {
                    'name': config.name,
                    'created_at': config.created_at.isoformat() if config.created_at else None,
                    'updated_at': config.updated_at.isoformat() if config.updated_at else None,
                    'last_used': config.last_used.isoformat() if config.last_used else None
                }
        return None


