"""acl credentials * — управление учётными данными."""

from __future__ import annotations

import typer

from acl_cli import client
from acl_cli.output import error, info, success, table, spinner

app = typer.Typer(help="Управление учётными данными", no_args_is_help=True)


@app.command("save")
def save(
    site_domain: str = typer.Argument(..., help="Домен сайта"),
    user: str = typer.Option("default", "--user", "-u", help="X-User-ID"),
) -> None:
    """Интерактивно сохранить учётные данные для сайта."""
    login = typer.prompt("Логин")
    password = typer.prompt("Пароль", hide_input=True)

    with spinner("Сохранение..."):
        client.post(
            "/credentials",
            json={
                "site_domain": site_domain,
                "auth_type": "login_password",
                "login": login,
                "password": password,
            },
            headers={"X-User-ID": user},
        )
    success(f"Учётные данные сохранены для {site_domain}")


@app.command("list")
def list_credentials(
    user: str = typer.Option("default", "--user", "-u", help="X-User-ID"),
) -> None:
    """Показать сохранённые учётные данные (пароль скрыт)."""
    with spinner("Загрузка..."):
        result = client.get("/credentials", headers={"X-User-ID": user})
    rows = result if isinstance(result, list) else []
    if not rows:
        info("Нет сохранённых учётных данных.")
        return
    for row in rows:
        login = row.get("login", "")
        if login and len(login) > 2:
            row["login"] = login[:2] + "***"
        row.pop("password", None)
    table(rows, columns=["site_domain", "auth_type", "login"])


@app.command("delete")
def delete(
    site_domain: str = typer.Argument(..., help="Домен сайта"),
    user: str = typer.Option("default", "--user", "-u", help="X-User-ID"),
) -> None:
    """Удалить учётные данные для сайта."""
    confirm = typer.confirm(
        f"Удалить учётные данные для {site_domain}?", default=False
    )
    if not confirm:
        info("Отменено.")
        raise typer.Exit(0)
    client.delete(
        f"/credentials/{site_domain}",
        headers={"X-User-ID": user},
    )
    success(f"Учётные данные для {site_domain} удалены")


@app.command("test")
def test(
    site_domain: str = typer.Argument(..., help="Домен сайта"),
    user: str = typer.Option("default", "--user", "-u", help="X-User-ID"),
) -> None:
    """Проверить учётные данные для сайта."""
    with spinner(f"Проверка авторизации {site_domain}..."):
        result = client.post(
            f"/credentials/{site_domain}/test",
            headers={"X-User-ID": user},
        )

    authenticated = result.get("authenticated") or result.get("success", False)
    if authenticated:
        success(f"Авторизация успешна: {site_domain}")
    else:
        msg = result.get("error") or result.get("message", "неверный пароль")
        error(f"Ошибка авторизации: {msg}")
        raise typer.Exit(1)
