#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
软件配置（与软件一起走）：存放于本机固定目录，与当前打开的项目无关。
- 最近打开的项目列表、应用级偏好、日志等。
项目配置（与项目一起走）：存放于项目目录 .server_manager/config/ 下，如 user.config、default.config（首次打开从软件安装目录 config/ 复制）。
"""

import json
import os
import sys
from pathlib import Path
from typing import Any, Dict, List

from services.commands import project_has_default_kv_for_manager


def get_app_config_dir() -> Path:
    """软件配置根目录（与软件一起，不随项目或运行目录变化）。
    Windows: %%LocalAppData%%\\ServerManager
    其他: ~/.config/ServerManager
    打包后与未打包使用同一规则，保证配置持久且唯一。
    """
    if sys.platform == "win32":
        base = os.environ.get("LOCALAPPDATA") or os.path.expanduser("~")
        root = Path(base) / "ServerManager"
    else:
        root = Path.home() / ".config" / "ServerManager"
    root.mkdir(parents=True, exist_ok=True)
    return root


def get_app_config_path() -> Path:
    """软件配置文件路径（JSON）。"""
    return get_app_config_dir() / "app_config.json"


def load_app_config() -> Dict[str, Any]:
    """加载软件配置。若不存在或损坏则返回空字典。"""
    path = get_app_config_path()
    if not path.exists():
        return {}
    try:
        with open(path, "r", encoding="utf-8") as f:
            data = json.load(f)
        return data if isinstance(data, dict) else {}
    except Exception:
        return {}


def save_app_config(data: Dict[str, Any]) -> None:
    """保存软件配置。"""
    path = get_app_config_path()
    try:
        with open(path, "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
    except Exception:
        pass


def get_recent_projects() -> List[str]:
    """从软件配置中读取最近打开的项目路径列表（最多 10 个，仅返回仍存在的有效项目）。"""
    data = load_app_config()
    raw = data.get("recent_projects") or []
    if not isinstance(raw, list):
        return []
    result = []
    for item in raw[:15]:
        s = str(item).strip()
        if not s or s in result:
            continue
        p = Path(s)
        if p.exists() and project_has_default_kv_for_manager(p):
            result.append(s)
            if len(result) >= 10:
                break
    return result


def save_recent_project(project_path: str) -> None:
    """将项目路径加入软件配置的最近列表并保存。"""
    data = load_app_config()
    current = get_recent_projects()
    project_path = str(Path(project_path).resolve())
    if project_path in current:
        current.remove(project_path)
    current.insert(0, project_path)
    data["recent_projects"] = current[:10]
    save_app_config(data)


def get_app_log_dir() -> Path:
    """软件日志目录（与软件一起，用于存放 server_manager_*.log）。"""
    log_dir = get_app_config_dir() / "logs"
    log_dir.mkdir(parents=True, exist_ok=True)
    return log_dir
