# =============================================================================
# 企微IT智能服务台 — 系统配置模型
# =============================================================================
# 说明：对应数据库 system_configs 表，存储系统级配置项
# 包括：关键词列表、评分阈值、话术模板等
# 优势：配置存在数据库中，支持后台动态修改，无需重启服务
# =============================================================================

import uuid
from datetime import datetime

from sqlalchemy import DateTime, String, Text
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base


class SystemConfig(Base):
    """系统配置模型 — 对应 system_configs 表。

    将可动态修改的配置项存储在数据库中，
    支持后台修改后立即生效，无需重启服务。

    Attributes:
        id: 配置唯一标识（UUID，数据库自动生成）
        config_key: 配置键（唯一，如 "hand_raise_keywords"）
        config_value: 配置值（JSON 字符串或纯文本）
        description: 配置说明
        updated_at: 更新时间
    """

    # 表名（必须和架构文档 DDL 一致）
    __tablename__ = "system_configs"

    # --------------------------------------------------------------------------
    # 字段定义
    # --------------------------------------------------------------------------

    # 主键：UUID，Python端生成（兼容PostgreSQL和SQLite）
    id: Mapped[str] = mapped_column(
        String(36),
        primary_key=True,
        default=lambda: str(uuid.uuid4()),
    )

    # 配置键（唯一，用于查找配置项）
    # 示例：hand_raise_keywords, emotion_keywords_angry, polling_interval_seconds
    config_key: Mapped[str] = mapped_column(
        String(128),
        unique=True,
        nullable=False,
        comment="配置键",
    )

    # 配置值（存储 JSON 字符串或纯文本）
    # JSON 示例：'["转人工","人工","人工服务"]'
    # 纯文本示例：'3'（表示阈值）
    config_value: Mapped[str] = mapped_column(
        Text,
        nullable=False,
        comment="配置值（JSON字符串或纯文本）",
    )

    # 配置说明（方便管理员理解配置用途）
    description: Mapped[str] = mapped_column(
        String(256),
        nullable=False,
        default="",
        comment="配置说明",
    )

    # 更新时间（配置修改时自动更新）
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        nullable=False,
        default=datetime.now,
        onupdate=datetime.now,
        comment="更新时间",
    )

    def __repr__(self) -> str:
        """配置对象的字符串表示，方便调试。"""
        return f"<SystemConfig(key={self.config_key}, value={self.config_value})>"
