"""acl init — register and configure ACL in 30 seconds."""

from __future__ import annotations

import httpx
import typer
from rich.panel import Panel

from acl_cli import config
from acl_cli.output import console, error, info, success, warning, spinner


def init(
    reset: bool = typer.Option(False, "--reset", help="Перерегистрироваться"),
) -> None:
    """Зарегистрироваться и настроить ACL."""

    existing = config.load_config()

    # Already configured
    if existing and not reset:
        email = existing.get("email", "unknown")
        success(f"Уже настроен: {email}")
        info("Для смены аккаунта: acl init --reset")
        return

    # First run / reset
    console.print(
        Panel(
            "[bold cyan]ACL — Agent Control Layer[/]\n"
            "[dim]Настройка займёт 30 секунд[/dim]",
            border_style="cyan",
            padding=(1, 2),
        )
    )

    email = typer.prompt("Email")
    name = typer.prompt("Имя")

    base_url = config.DEFAULT_BASE_URL

    with spinner("Регистрация..."):
        try:
            resp = httpx.post(
                f"{base_url}/auth/register",
                json={"email": email, "name": name},
                timeout=30.0,
            )
            resp.raise_for_status()
        except httpx.HTTPStatusError as exc:
            status = exc.response.status_code
            if status == 429:
                warning("Слишком много запросов. Подождите немного и повторите.")
                raise typer.Exit(1)
            body = {}
            ct = exc.response.headers.get("content-type", "")
            if ct.startswith("application/json"):
                try:
                    body = exc.response.json()
                except Exception:
                    pass
            detail = body.get("detail", exc.response.text)
            error(f"Регистрация не удалась: {detail}")
            raise typer.Exit(1)
        except httpx.RequestError:
            error(f"ACL API недоступен: {base_url}")
            error("Проверьте соединение или статус сервера.")
            raise typer.Exit(1)

    data = resp.json()
    api_key = data.get("api_key") or data.get("key", "")

    config.save_config(api_key=api_key, base_url=base_url, email=email)

    success(f"Зарегистрирован: {email}")
    success(f"API-ключ сохранён: {config.CONFIG_FILE}")
    console.print()
    info("Попробуйте: acl browser open example.com")
