from __future__ import annotations

import json
import os
from pathlib import Path
from typing import Any
from urllib.parse import urlsplit, urlunsplit

DEFAULT_PROFILE = "default"
DEFAULT_TIMEOUT_SECONDS = 30.0
DEFAULT_USER_AGENT = "qingflow-mcp/1.0"
DEFAULT_RECORD_LIST_TYPE = 8
ATTACHMENT_QUESTION_TYPE = 13
DEFAULT_BASE_URL = "https://qingflow.com/api"


def get_mcp_home() -> Path:
    custom_home = os.getenv("QINGFLOW_MCP_HOME")
    return Path(custom_home).expanduser() if custom_home else Path.home() / ".qingflow-mcp"


def get_profiles_path() -> Path:
    return get_mcp_home() / "profiles.json"


def get_config_file_paths() -> list[Path]:
    """
    获取可能的配置文件路径列表，按优先级排序：
    1. 环境变量 QINGFLOW_MCP_CONFIG_PATH 指定的路径
    2. 当前工作目录下的 qingflow-mcp.config.json
    3. MCP home 目录下的 config.json
    4. 系统级配置 (Linux/Mac: /etc/qingflow-mcp/config.json)
    """
    paths: list[Path] = []

    # 1. 环境变量
    env_config = os.getenv("QINGFLOW_MCP_CONFIG_PATH")
    if env_config:
        paths.append(Path(env_config).expanduser())

    # 2. 当前工作目录
    paths.append(Path.cwd() / "qingflow-mcp.config.json")

    # 3. MCP home 目录
    paths.append(get_mcp_home() / "config.json")

    # 4. 系统级配置 (仅非 Windows)
    if os.name != "nt":
        paths.append(Path("/etc/qingflow-mcp/config.json"))

    return paths


def load_config_file() -> dict[str, Any]:
    """
    加载第一个存在的配置文件

    Returns:
        配置字典，如果没有找到配置文件则返回空字典
    """
    for path in get_config_file_paths():
        if path.exists():
            try:
                with open(path, "r", encoding="utf-8") as f:
                    content = f.read()
                    # 移除 JSON 注释 (简单的行注释处理)
                    lines = []
                    for line in content.split("\n"):
                        stripped = line.strip()
                        if not stripped.startswith("//") and not stripped.startswith("#"):
                            lines.append(line)
                    return json.loads("\n".join(lines))
            except (json.JSONDecodeError, IOError) as e:
                # 配置文件存在但读取失败，记录警告但不中断
                print(f"Warning: Failed to load config from {path}: {e}")
                continue
    return {}


def get_config_value(key: str, env_var: str | None = None, default: Any = None) -> Any:
    """
    获取配置值，优先级：环境变量 > 配置文件 > 默认值

    Args:
        key: 配置文件中的键名 (支持点号分隔的嵌套键，如 "profiles.default.name")
        env_var: 环境变量名
        default: 默认值

    Returns:
        配置值
    """
    # 1. 环境变量
    if env_var:
        env_value = os.getenv(env_var)
        if env_value is not None:
            return env_value

    # 2. 配置文件
    config = load_config_file()
    keys = key.split(".")
    value = config
    for k in keys:
        if isinstance(value, dict) and k in value:
            value = value[k]
        else:
            value = None
            break

    if value is not None:
        return value

    # 3. 默认值
    return default


def get_default_base_url() -> str | None:
    """获取默认的 Qingflow 后端地址"""
    value = get_config_value(
        "default_base_url",
        env_var="QINGFLOW_MCP_DEFAULT_BASE_URL",
        default=DEFAULT_BASE_URL
    )
    return normalize_base_url(value) if value else None


def get_default_qf_version() -> str | None:
    """获取默认的 qfVersion 路由值"""
    value = get_config_value(
        "default_qf_version",
        env_var="QINGFLOW_MCP_DEFAULT_QF_VERSION",
        default=None,
    )
    if value is None:
        return None
    normalized = str(value).strip()
    return normalized or None


def get_timeout_seconds() -> float:
    """获取 HTTP 超时秒数"""
    value = get_config_value(
        "timeout_seconds",
        env_var="QINGFLOW_MCP_TIMEOUT_SECONDS",
        default=DEFAULT_TIMEOUT_SECONDS
    )
    try:
        return float(value)
    except (ValueError, TypeError):
        return DEFAULT_TIMEOUT_SECONDS


def get_log_level() -> str:
    """获取日志级别"""
    return get_config_value(
        "log_level",
        env_var="QINGFLOW_MCP_LOG_LEVEL",
        default="INFO"
    )


def normalize_base_url(base_url: str | None) -> str | None:
    """规范化 base URL"""
    if base_url is None:
        return None
    normalized = base_url.strip()
    if not normalized:
        return None
    normalized = normalized.rstrip("/")
    try:
        parsed = urlsplit(normalized)
    except ValueError:
        return normalized
    if not parsed.scheme or not parsed.netloc:
        return normalized

    hostname = parsed.hostname or ""
    if hostname.lower() == "www.qingflow.com":
        netloc = "qingflow.com"
        if parsed.port is not None:
            netloc = f"{netloc}:{parsed.port}"
        normalized = urlunsplit((parsed.scheme, netloc, parsed.path, parsed.query, parsed.fragment))
    return normalized
