from typing import Optional

from fastapi import APIRouter, Depends, Query
from fastapi.responses import JSONResponse
from model.user_model import (
    UserGoogleLoginPayload,
    UserLoginPayload,
    UserForgotPasswordPayload,
    UserUpdatePasswordPayload,
    UserModel,
)
from utils.turnstile_helper import verify_turnstile

router = APIRouter(prefix="/user", tags=["User API"])


@router.post("/auth/google", dependencies=[Depends(verify_turnstile)])
async def user_google_login(payload: UserGoogleLoginPayload):
    try:
        user = UserModel.handle_google_login(payload)

        return {
            "success": True,
            "data": {
                "id": str(user.get("_id")),
                "email": user.get("email"),
                "firstName": user.get("firstName", ""),
                "lastName": user.get("lastName", ""),
                "avatarUrl": user.get("avatarUrl", ""),
                "balance": user.get("balance", 0),
                "role": user.get("role", "user"),
                "hasPassword": bool(user.get("password")),
            },
            "message": "Đăng nhập Google thành công",
        }
    except Exception as e:
        return {"success": False, "message": str(e)}


@router.post("/auth/login", dependencies=[Depends(verify_turnstile)])
async def user_login(payload: UserLoginPayload):
    user = UserModel.verify_login(payload.email, payload.password)

    if user:
        return {
            "success": True,
            "data": {
                "id": str(user["_id"]),
                "email": user["email"],
                "firstName": user.get("firstName", ""),
                "lastName": user.get("lastName", ""),
                "avatarUrl": user.get("avatarUrl", ""),
                "balance": user.get("balance", 0),
                "role": "user",
                "hasPassword": True,
            },
        }
    return {"success": False, "message": "Email hoặc mật khẩu không chính xác!"}


@router.post("/forgot-password", dependencies=[Depends(verify_turnstile)])
async def forgot_password(payload: UserForgotPasswordPayload):
    success, message = UserModel.reset_password(payload.email)
    return {"success": success, "message": message}


@router.get("/me")
def get_user_me(email: str):
    user = UserModel.get_user_by_email(email)
    if not user:
        return JSONResponse(
            status_code=404,
            content={"success": False, "message": "Không tìm thấy User"},
        )

    return {
        "success": True,
        "data": {
            "id": str(user.get("_id")),
            "email": user.get("email"),
            "firstName": user.get("firstName", ""),
            "lastName": user.get("lastName", ""),
            "phone": user.get("phone", ""),
            "address": user.get("address", ""),
            "avatarUrl": user.get("avatarUrl"),
            "balance": user.get("balance", 0),
            "role": "user",
            "createdAt": user.get("createdAt", "2026-01-15T08:00:00.000Z"),
        },
    }


@router.get("/search")
def search_users(
    keyword: str = Query("", description="Từ khóa tìm kiếm user"),
    page: int = Query(1, ge=1),
    pageSize: int = Query(10, ge=1, le=100),
    dateFrom: Optional[str] = Query(None, description="YYYY-MM-DD"),
    dateTo: Optional[str] = Query(None, description="YYYY-MM-DD"),
    sortBy: str = Query("balance", pattern="^(balance|spent)$"),
    sortOrder: str = Query("desc", pattern="^(asc|desc)$"),
):
    result = UserModel.search_users(
        keyword=keyword,
        page=page,
        page_size=pageSize,
        date_from=dateFrom,
        date_to=dateTo,
        sort_by=sortBy,
        sort_order=sortOrder,
    )

    return {
        "success": True,
        "data": result["items"],
        "total": result["total"],
        "page": result["page"],
        "pageSize": result["pageSize"],
        "totalPages": result["totalPages"],
    }


@router.put("/update-password", dependencies=[Depends(verify_turnstile)])
async def update_password(payload: UserUpdatePasswordPayload):
    success = UserModel.update_password(payload.email, payload.newPassword)
    if success:
        return {"success": True, "message": "Cập nhật thành công"}
    return {"success": False, "message": "Không tìm thấy user"}