"""
Admin CLI.

Usage examples:

    # Create the first Super Admin interactively:
    python -m admin_cli create-super-admin

    # Non-interactive:
    python -m admin_cli create-super-admin --email admin@site.com --password 'Str0ng!!Passw0rd' --name 'Ops Lead'

    # Force overwrite:
    python -m admin_cli create-super-admin --email admin@site.com --password '...' --force

    # List admins:
    python -m admin_cli list-admins
"""

import argparse
import getpass
import sys

from db.admin_models import AdminRole, AdminUser, init_admin_db
from db.models import SessionLocal


def _cmd_create_super_admin(args) -> int:
    # Ensure tables + roles exist first.
    init_admin_db()

    from admin.bootstrap import _create_super_admin

    email = args.email or input("Email: ").strip()
    name = args.name or input("Full name [Super Admin]: ").strip() or "Super Admin"
    password = args.password or getpass.getpass("Password (min 12 chars): ")

    if not email or "@" not in email:
        print("ERR: invalid email", file=sys.stderr)
        return 2
    if not password:
        print("ERR: password required", file=sys.stderr)
        return 2

    with SessionLocal() as db:
        try:
            row = _create_super_admin(
                db, email=email, password=password,
                full_name=name, force=bool(args.force),
            )
        except ValueError as e:
            print(f"ERR: {e}", file=sys.stderr)
            return 1
        except Exception as e:
            print(f"ERR: {e}", file=sys.stderr)
            return 1

    print(f"OK — Super Admin ready: id={row.id} email={row.email}")
    return 0


def _cmd_list_admins(_args) -> int:
    init_admin_db()
    with SessionLocal() as db:
        rows = (
            db.query(AdminUser)
            .order_by(AdminUser.id.asc())
            .all()
        )
        if not rows:
            print("(no admins yet — run create-super-admin first)")
            return 0
        for r in rows:
            role = getattr(r.role, "code", "-")
            print(f"[{r.id:>3}] {r.email:<40} role={role:<20} active={r.is_active} last_login={r.last_login_at or '—'}")
    return 0


def main() -> int:
    p = argparse.ArgumentParser(prog="admin_cli", description="TheTradeLogic — Admin CLI")
    sub = p.add_subparsers(dest="cmd", required=True)

    c1 = sub.add_parser("create-super-admin", help="Create the first (or additional) Super Admin")
    c1.add_argument("--email")
    c1.add_argument("--password")
    c1.add_argument("--name")
    c1.add_argument("--force", action="store_true", help="Overwrite if the email exists")

    sub.add_parser("list-admins", help="List all admin accounts")

    args = p.parse_args()
    if args.cmd == "create-super-admin":
        return _cmd_create_super_admin(args)
    if args.cmd == "list-admins":
        return _cmd_list_admins(args)
    p.print_help()
    return 0


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