#!/usr/bin/env python3
"""Обновление списка доменных зон для Unicode-парсера."""

from __future__ import annotations

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

import httpx

from ioc_checker.http_client import build_sync_http_client

LOGGER = logging.getLogger("update-tlds")
DEFAULT_URL = "https://tld-list.com/df/tld-list-basic.txt"


def configure_logging(verbose: bool) -> None:
    """Настроить систему логирования для скрипта."""

    level = logging.DEBUG if verbose else logging.INFO
    logging.basicConfig(level=level, format="[%(name)s] %(message)s", force=True)


def repo_destination() -> Path:
    """Возвратить путь к файлу tlds.txt внутри репозитория."""

    script_path = Path(__file__).resolve()
    return script_path.parent.parent / "lists" / "tlds.txt"


def parse_args(argv: Iterable[str]) -> argparse.Namespace:
    """Разобрать аргументы командной строки."""

    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--url", default=DEFAULT_URL, help="Источник списка TLD")
    parser.add_argument(
        "--destination",
        type=Path,
        default=repo_destination(),
        help="Путь для сохранения файла tlds.txt",
    )
    parser.add_argument(
        "--verbose", "-v", action="store_true", help="Подробный вывод для отладки"
    )
    return parser.parse_args(list(argv))


def download_tlds(client: httpx.Client, url: str) -> str:
    """Загрузить список TLD по указанной ссылке."""

    LOGGER.debug("Запрашиваем список TLD по адресу %s", url)
    try:
        response = client.get(url)
        response.raise_for_status()
    except httpx.HTTPError as exc:
        raise SystemExit(f"Не удалось загрузить список TLD: {exc}") from exc

    payload = response.text
    LOGGER.info("Получено %d байт", len(payload.encode("utf-8")))
    return payload


def save_tlds(payload: str, destination: Path) -> None:
    """Сохранить список TLD в ``destination``."""

    destination.parent.mkdir(parents=True, exist_ok=True)
    destination.write_text(payload, encoding="utf-8", newline="")
    LOGGER.info("Список TLD сохранён в %s", destination)


def update_tlds(url: str, destination: Path) -> None:
    """Выполнить загрузку и сохранение списка доменных зон."""

    with build_sync_http_client(timeout=30.0) as client:
        payload = download_tlds(client, url)
    save_tlds(payload, destination)


def main(argv: Iterable[str]) -> int:
    """Точка входа в утилиту обновления."""

    args = parse_args(argv)
    configure_logging(args.verbose)
    LOGGER.debug("Используемые параметры: %s", args)
    update_tlds(args.url, args.destination)
    return 0


if __name__ == "__main__":  # pragma: no cover - ручной запуск
    sys.exit(main(sys.argv[1:]))
