from fastapi import APIRouter, Depends, Request
from sqlalchemy.ext.asyncio import AsyncSession

from src.apps.auth.schemas.requests import (
    LoginRequest,
    RefreshTokenRequest,
    UpdateProfileRequest,
)
from src.apps.auth.schemas.responses import TokenResponse, AccessTokenResponse, UserResponse
from src.apps.auth.services.auth_service import AuthService
from src.core.dependencies import get_current_user
from src.core.schemas.response import success
from src.database.session import get_db

router = APIRouter(prefix="/auth", tags=["Auth"])


@router.post("/login", response_model=dict)
async def login(
    body: LoginRequest,
    request: Request,
    db: AsyncSession = Depends(get_db),
):
    tenant_id = getattr(request.state, "tenant_id", None)
    service = AuthService(db)
    access_token, refresh_token, user = await service.login(
        body.email, body.password, tenant_id
    )
    return success(
        data={
            "access_token": access_token,
            "refresh_token": refresh_token,
            "token_type": "bearer",
            "user": UserResponse.model_validate(user).model_dump(),
        },
        message="Login successful",
    )


@router.post("/refresh", response_model=dict)
async def refresh_token(
    body: RefreshTokenRequest,
    db: AsyncSession = Depends(get_db),
):
    service = AuthService(db)
    access_token = await service.refresh_access_token(body.refresh_token)
    return success(
        data={"access_token": access_token, "token_type": "bearer"},
        message="Token refreshed",
    )


@router.post("/logout", status_code=204)
async def logout(
    body: RefreshTokenRequest,
    db: AsyncSession = Depends(get_db),
):
    service = AuthService(db)
    await service.logout(body.refresh_token)


@router.get("/me", response_model=dict)
async def get_me(current_user=Depends(get_current_user)):
    return success(data=UserResponse.model_validate(current_user).model_dump())


@router.patch("/me", response_model=dict)
async def update_profile(
    body: UpdateProfileRequest,
    current_user=Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
):
    if body.first_name is not None:
        current_user.first_name = body.first_name
    if body.last_name is not None:
        current_user.last_name = body.last_name
    if body.avatar_url is not None:
        current_user.avatar_url = body.avatar_url
    await db.flush()
    return success(
        data=UserResponse.model_validate(current_user).model_dump(),
        message="Profile updated",
    )
