from __future__ import annotations

from sqlalchemy import select
from sqlalchemy.orm import Session

from app.models.ai_config import SystemConfig


RESPONSE_DEPTH_KEY = "agent_response_depth"
DEFAULT_RESPONSE_DEPTH = 35
MIN_RESPONSE_DEPTH = 0
MAX_RESPONSE_DEPTH = 100


class ResponseStyleService:
    @staticmethod
    def get_depth(db: Session) -> int:
        config = db.scalar(select(SystemConfig).where(SystemConfig.config_key == RESPONSE_DEPTH_KEY))
        if config is None:
            return DEFAULT_RESPONSE_DEPTH
        try:
            return _clamp_depth(int(config.config_value))
        except (TypeError, ValueError):
            return DEFAULT_RESPONSE_DEPTH

    @staticmethod
    def set_depth(db: Session, depth: int, admin_id: int | None) -> SystemConfig:
        config = db.scalar(select(SystemConfig).where(SystemConfig.config_key == RESPONSE_DEPTH_KEY))
        if config is None:
            config = SystemConfig(config_key=RESPONSE_DEPTH_KEY, config_value=str(DEFAULT_RESPONSE_DEPTH))
        config.config_value = str(_clamp_depth(depth))
        config.description = "Agent 回答深度，0 为精简，100 为深入"
        config.updated_by = admin_id
        db.add(config)
        return config

    @classmethod
    def build_instruction(cls, db: Session, depth: int | None = None) -> str:
        value = _clamp_depth(cls.get_depth(db) if depth is None else depth)
        if value <= 33:
            mode = "精简"
            rules = (
                "回答要短，通常控制在1到3段或3条以内；不展开心理分析、不复盘学员长篇经历，"
                "优先给出一句方向确认，再引导回到当下、身体感受和情绪觉察。建议只给当下最小一步，"
                "避免连续列出多个深入方案。"
            )
        elif value <= 66:
            mode = "平衡"
            rules = (
                "回答保持适中，可以先确认方向，再补充必要原因和1到3个可执行提醒；"
                "不做过度拆解，不把分析过程完整罗列出来。"
            )
        else:
            mode = "深入"
            rules = (
                "可以更完整地解释原因、步骤和注意事项，但仍要避免变成咨询式长篇分析；"
                "优先围绕回到当下、回到自身、觉察情绪和身体感受、如是释放来组织内容。"
            )
        return (
            "\n\n[回答深度控制]\n"
            f"当前回答深度：{value}/100（{mode}）。{rules}"
            "无论深度如何，都不要暴露内部分析过程；不要替学员做复杂人格判断；"
            "涉及功课反馈时，先判断方向是否偏离，再给最少必要的下一步。"
        )


def _clamp_depth(value: int) -> int:
    return max(MIN_RESPONSE_DEPTH, min(MAX_RESPONSE_DEPTH, value))
