"""Auth router — thin handler'lar. Parse + Service çağır + response zarfı."""
from fastapi import APIRouter, Depends

from app.auth.dependencies import get_current_tenant, get_token_jti
from app.models.tenant import Tenant
from app.schemas.auth import (
    ChangePasswordRequest,
    LoginRequest,
    RegisterRequest,
    UpdateProfileRequest,
)
from app.services.auth_service import AuthService
from app.utils.responses import created, no_content, ok

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


@router.post("/register")
async def register(body: RegisterRequest, service: AuthService = Depends()):
    result = await service.register(body)
    return created(result.model_dump(mode="json"))


@router.post("/login")
async def login(body: LoginRequest, service: AuthService = Depends()):
    result = await service.login(body)
    return ok(result.model_dump(mode="json"))


@router.get("/me")
async def me(tenant: Tenant = Depends(get_current_tenant), service: AuthService = Depends()):
    result = await service.get_profile(tenant)
    return ok(result.model_dump(mode="json"))


@router.post("/logout")
async def logout(jti: str = Depends(get_token_jti), service: AuthService = Depends()):
    await service.logout(jti)
    return no_content()


@router.post("/refresh")
async def refresh(
    tenant: Tenant = Depends(get_current_tenant),
    jti: str = Depends(get_token_jti),
    service: AuthService = Depends(),
):
    token = await service.refresh(tenant, jti)
    return ok(token.model_dump(mode="json"))


@router.put("/profile")
async def update_profile(
    body: UpdateProfileRequest,
    tenant: Tenant = Depends(get_current_tenant),
    service: AuthService = Depends(),
):
    result = await service.update_profile(tenant, body)
    return ok(result.model_dump(mode="json"))


@router.post("/change-password")
async def change_password(
    body: ChangePasswordRequest,
    tenant: Tenant = Depends(get_current_tenant),
    service: AuthService = Depends(),
):
    await service.change_password(tenant, body)
    return no_content()
