from fastapi import APIRouter, Depends, HTTPException, Request

from model.access_token_model import AccessTokenModel
from model.admin_model import AdminLoginPayload, AdminModel
from utils.auth_helper import get_current_actor_required
from utils.settings import ACCESS_TOKEN_TTL_HOURS
from utils.turnstile_helper import verify_turnstile

router = APIRouter(prefix="/admin", tags=["Admin API"])


def _client_ip(request: Request) -> str:
    return request.client.host if request.client else ""


@router.post("/login", dependencies=[Depends(verify_turnstile)])
async def admin_login(payload: AdminLoginPayload, request: Request):
    admin_user = AdminModel.verify_login(payload.email, payload.password)

    if not admin_user:
        return {"success": False, "message": "Tài khoản hoặc mật khẩu Quản trị viên không đúng!"}

    issued = AccessTokenModel.issue_token(
        actor_id=admin_user["_id"],
        actor_role="admin",
        ttl_hours=ACCESS_TOKEN_TTL_HOURS,
        created_by_ip=_client_ip(request),
        user_agent=request.headers.get("user-agent", ""),
    )

    return {
        "success": True,
        "data": {
            "accessToken": issued["rawToken"],
            "tokenType": "Bearer",
            "expiresIn": ACCESS_TOKEN_TTL_HOURS * 3600,
            "user": {
                "id": admin_user["_id"],
                "email": admin_user["email"],
                "firstName": admin_user["firstName"],
                "lastName": admin_user["lastName"],
                "role": admin_user["role"],
                "hasPassword": True,
            },
        },
    }


@router.get("/me")
async def get_admin_me(current_user=Depends(get_current_actor_required)):
    if current_user.get("role") != "admin":
        raise HTTPException(status_code=403, detail="Admin required")

    return {
        "success": True,
        "data": {
            "id": current_user.get("id"),
            "email": current_user.get("email", "admin@factory.com"),
            "firstName": "Admin",
            "role": "admin",
        },
    }