# -*- coding: utf-8 -*-
"""Какая версия программы запущена и из какой сборки.

Понадобилось после разговора, в котором нельзя было ответить на простой
вопрос: на компьютере стоит новая программа или старая? Снимки экрана
приходилось разбирать по цвету кнопок. Версия должна быть видна в окне и
попадать в журнал и в отчёт — тогда это вопрос одного взгляда.

Номер живёт в одном файле VERSION в корне продукта. Всё остальное — сборка,
дата, коммит — пишет Pack-Release в BUILD.txt при упаковке архива.
"""
from __future__ import annotations

import os
from pathlib import Path

FALLBACK = "0.0.0"


def _candidates() -> list[Path]:
    """Где искать файлы. Порядок — от «рядом с кодом» к «в доме продукта».

    Программа запускается двумя способами: из распакованного архива (файлы
    рядом) и из установленной копии в %USERPROFILE%\\.claude-proxy-control.
    """
    here = Path(__file__).resolve().parent
    home = Path(
        os.environ.get("CLAUDE_PROXY_HOME")
        or (Path(os.environ.get("USERPROFILE", ".")) / ".claude-proxy-control")
    )
    return [here, here.parent, home, home / "desktop"]


def _read(name: str) -> str:
    for base in _candidates():
        try:
            text = (base / name).read_text(encoding="utf-8-sig").strip()
        except Exception:
            continue
        if text:
            return text
    return ""


def app_version() -> str:
    """Номер версии, например 1.0.0. FALLBACK, если файла нет."""
    first = _read("VERSION").splitlines()
    return first[0].strip() if first else FALLBACK


def build_info() -> dict[str, str]:
    """Строки из BUILD.txt: built, python, sing-box, source, version."""
    out: dict[str, str] = {}
    for line in _read("BUILD.txt").splitlines():
        if ":" in line:
            key, _, value = line.partition(":")
            out[key.strip()] = value.strip()
    return out


def version_line() -> str:
    """Одна короткая строка для окна: «версия 1.0.0 · сборка 2026-08-10»."""
    text = "версия " + app_version()
    built = build_info().get("built", "")
    if built:
        text += " · сборка " + built.split(" ")[0]
    return text


def version_tuple(value: str) -> tuple[int, ...]:
    """1.2.10 → (1, 2, 10). Для сравнения версий: строкой «1.10» < «1.9»."""
    parts = []
    for chunk in str(value or "").split("."):
        digits = "".join(c for c in chunk if c.isdigit())
        parts.append(int(digits) if digits else 0)
    return tuple(parts or [0])


def is_newer(candidate: str, current: str) -> bool:
    """Строго новее ли candidate. Пустой или мусорный номер — не новее."""
    if not candidate:
        return False
    return version_tuple(candidate) > version_tuple(current)
