"""Автозапуск панели при входе в Windows (ключ HKCU\\...\\Run)."""

from __future__ import annotations

import logging
import sys
from pathlib import Path

from paths import get_panel_launch_exe

logger = logging.getLogger(__name__)

RUN_KEY = r"Software\Microsoft\Windows\CurrentVersion\Run"
VALUE_NAME = "AXON Dump Radar"


def _launch_target() -> Path | None:
    """Exe, который Windows будет запускать при старте (стабильная копия в AppData)."""
    exe = get_panel_launch_exe()
    if exe and Path(exe).exists():
        return Path(exe).resolve()
    return None


def _command() -> str | None:
    target = _launch_target()
    if not target:
        return None
    return f'"{target}"'


def is_supported() -> bool:
    """Автозапуск доступен только для собранного .exe на Windows."""
    if sys.platform != "win32":
        return False
    return _launch_target() is not None


def is_enabled() -> bool:
    if sys.platform != "win32":
        return False
    try:
        import winreg

        with winreg.OpenKey(winreg.HKEY_CURRENT_USER, RUN_KEY) as key:
            value, _ = winreg.QueryValueEx(key, VALUE_NAME)
            return bool(str(value).strip())
    except FileNotFoundError:
        return False
    except OSError:
        return False


def set_enabled(enabled: bool) -> bool:
    """Включить/выключить автозапуск. Возвращает итоговое состояние."""
    if sys.platform != "win32":
        raise RuntimeError("Автозапуск поддерживается только на Windows")

    import winreg

    if enabled:
        command = _command()
        if not command:
            raise RuntimeError(
                "Не найден установленный .exe панели. Автозапуск доступен только для установленной версии."
            )
        with winreg.CreateKey(winreg.HKEY_CURRENT_USER, RUN_KEY) as key:
            winreg.SetValueEx(key, VALUE_NAME, 0, winreg.REG_SZ, command)
        logger.info("Автозапуск включён: %s", command)
        return True

    try:
        with winreg.OpenKey(
            winreg.HKEY_CURRENT_USER, RUN_KEY, 0, winreg.KEY_SET_VALUE
        ) as key:
            winreg.DeleteValue(key, VALUE_NAME)
        logger.info("Автозапуск выключен")
    except FileNotFoundError:
        pass
    except OSError as e:
        logger.warning("Не удалось убрать автозапуск: %s", e)
    return False


def sync_on_launch() -> None:
    """Если автозапуск включён — обновить путь к exe (мог измениться после обновления)."""
    if sys.platform != "win32":
        return
    try:
        if not is_enabled():
            return
        command = _command()
        if not command:
            return
        import winreg

        with winreg.OpenKey(
            winreg.HKEY_CURRENT_USER, RUN_KEY, 0, winreg.KEY_READ | winreg.KEY_SET_VALUE
        ) as key:
            try:
                current, _ = winreg.QueryValueEx(key, VALUE_NAME)
            except FileNotFoundError:
                current = None
            if str(current) != command:
                winreg.SetValueEx(key, VALUE_NAME, 0, winreg.REG_SZ, command)
                logger.info("Автозапуск: путь обновлён на %s", command)
    except Exception as e:
        logger.warning("sync_on_launch: %s", e)


def get_state() -> dict:
    return {"supported": is_supported(), "enabled": is_enabled()}
