"""Yapılandırma yükleme, kaydetme ve ilk kurulum sihirbazı."""

from __future__ import annotations

import os
from dataclasses import dataclass
from pathlib import Path

from dotenv import load_dotenv, set_key

PROJECT_ROOT = Path(__file__).resolve().parent.parent
ENV_PATH = PROJECT_ROOT / ".env"

# Hetzner Inference dokümanındaki değer farklıysa .env üzerinden ez.
DEFAULT_BASE_URL = "https://api.inference.hetzner.com/v1"
DEFAULT_MODEL = "Qwen/Qwen3.8-27B"

# Base URL tahmini tutmazsa sihirbaz bunları sırayla dener.
BASE_URL_CANDIDATES = [
    "https://api.inference.hetzner.com/v1",
    "https://inference.hetzner.com/v1",
    "https://experiments.hetzner.com/api/inference/v1",
    "https://api.experiments.hetzner.com/v1",
]


def _env_float(key: str, default: float) -> float:
    try:
        return float(os.getenv(key, "") or default)
    except ValueError:
        return default


def _env_int(key: str, default: int) -> int:
    try:
        return int(os.getenv(key, "") or default)
    except ValueError:
        return default


@dataclass
class Config:
    api_key: str = ""
    base_url: str = DEFAULT_BASE_URL
    model: str = DEFAULT_MODEL
    # auto: önce native tool-calling dene, sunucu desteklemezse prompt moduna düş
    tool_mode: str = "auto"
    temperature: float = 0.3
    max_tokens: int = 8192
    max_steps: int = 25
    shell: str = ""
    workspace: Path = Path.cwd()
    yolo: bool = False
    unsafe: bool = False
    show_reasoning: bool = True

    @classmethod
    def load(cls) -> "Config":
        load_dotenv(ENV_PATH, override=False)
        return cls(
            api_key=os.getenv("QWEN_API_KEY", "").strip(),
            base_url=(os.getenv("QWEN_BASE_URL", "").strip() or DEFAULT_BASE_URL).rstrip("/"),
            model=os.getenv("QWEN_MODEL", "").strip() or DEFAULT_MODEL,
            tool_mode=os.getenv("QWEN_TOOL_MODE", "auto").strip().lower(),
            temperature=_env_float("QWEN_TEMPERATURE", 0.3),
            max_tokens=_env_int("QWEN_MAX_TOKENS", 8192),
            max_steps=_env_int("QWEN_MAX_STEPS", 25),
            shell=os.getenv("QWEN_SHELL", "").strip(),
            workspace=Path.cwd(),
        )

    def save(self) -> None:
        """API anahtarı, base URL ve modeli .env dosyasına yazar."""
        ENV_PATH.touch(exist_ok=True)
        set_key(str(ENV_PATH), "QWEN_API_KEY", self.api_key)
        set_key(str(ENV_PATH), "QWEN_BASE_URL", self.base_url)
        set_key(str(ENV_PATH), "QWEN_MODEL", self.model)
        set_key(str(ENV_PATH), "QWEN_TOOL_MODE", self.tool_mode)

    @property
    def is_configured(self) -> bool:
        return bool(self.api_key)

    def masked_key(self) -> str:
        if not self.api_key:
            return "(yok)"
        if len(self.api_key) <= 10:
            return "*" * len(self.api_key)
        return f"{self.api_key[:6]}...{self.api_key[-4:]}"
