"""Почистване на тестови и build артефакти за Gnomenall 312.

Скриптът премахва файлове и директории, създавани от тестове,
локален сървър и помощни инструменти.
"""

from __future__ import annotations

import argparse
import logging
import shutil
from pathlib import Path
from typing import Iterable


def _setup_logger(verbose: bool) -> logging.Logger:
    logger = logging.getLogger("cleanup")
    logger.setLevel(logging.DEBUG if verbose else logging.INFO)
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter("[%(levelname)s] %(message)s"))
    logger.handlers = [handler]
    logger.propagate = False
    return logger


def _is_in_venv(path: Path) -> bool:
    return "venv" in {part.lower() for part in path.parts}


def _remove_path(path: Path, logger: logging.Logger, dry_run: bool) -> None:
    if not path.exists():
        return
    if dry_run:
        logger.info("DRY-RUN: %s", path)
        return
    try:
        if path.is_dir():
            shutil.rmtree(path, ignore_errors=False)
        else:
            path.unlink(missing_ok=True)
        logger.info("Премахнато: %s", path)
    except Exception as exc:
        logger.warning("Неуспешно премахване %s: %s", path, exc)


def _iter_pycache(root: Path) -> Iterable[Path]:
    for path in root.rglob("__pycache__"):
        if _is_in_venv(path):
            continue
        yield path
    for path in root.rglob("*.pyc"):
        if _is_in_venv(path):
            continue
        yield path
    for path in root.rglob("*.pyo"):
        if _is_in_venv(path):
            continue
        yield path


def _collect_targets(root: Path, keep_user_data: bool) -> list[Path]:
    targets: list[Path] = []

    targets.extend(
        [
            root / "inbox",
            root / "library",
            root / "logs",
            root / "assets" / "screenshots",
            root / ".pytest_cache",
            root / ".mypy_cache",
            root / ".ruff_cache",
            root / ".coverage",
            root / "htmlcov",
        ]
    )

    targets.extend(
        [
            root / "gnomenall.db",
            root / "data" / "gnomenall.db",
            root / "data" / "torrents",
        ]
    )

    if not keep_user_data:
        targets.extend(
            [
                root / "data" / "identity.json",
                root / "config" / "settings.json",
                root / "i18n" / "locale.json",
            ]
        )

    targets.extend(_iter_pycache(root))

    return targets


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Почистване на тестови и build артефакти (Gnomenall 312)"
    )
    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="Показва какво ще се изтрие, без реално изтриване",
    )
    parser.add_argument(
        "--keep-user-data",
        action="store_true",
        help="Запазва identity/settings/config/locale данните",
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="Подробен лог",
    )
    args = parser.parse_args()

    root = Path(__file__).resolve().parent.parent
    logger = _setup_logger(args.verbose)

    targets = _collect_targets(root, keep_user_data=args.keep_user_data)
    unique_targets: list[Path] = []
    seen: set[Path] = set()
    for target in targets:
        if target in seen:
            continue
        seen.add(target)
        unique_targets.append(target)

    if not unique_targets:
        logger.info("Няма намерени артефакти за изтриване.")
        return 0

    logger.info("Открити %s артефакта.", len(unique_targets))
    for target in unique_targets:
        _remove_path(target, logger, dry_run=args.dry_run)

    if args.dry_run:
        logger.info("DRY-RUN приключи. Нищо не е изтрито.")
    else:
        logger.info("Почистването приключи.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
