"""API keys domain - FastAPI router."""
from uuid import UUID

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

from src.core.database import get_db
from src.domain.api_keys.repository import ApiKeyRepository
from src.domain.api_keys.schemas import ApiKeyCreate, ApiKeyCreatedResponse, ApiKeyResponse
from src.domain.api_keys.service import ApiKeyService
from src.domain.auth.models import User
from src.domain.auth.router import get_current_user
from src.domain.workspaces.facades import WorkspaceFacadeImpl
from src.domain.workspaces.repository import MembershipRepository, WorkspaceRepository

router = APIRouter(prefix="/api/workspaces/{ws}/api-keys", tags=["api-keys"])


async def get_api_key_service(db: AsyncSession = Depends(get_db)) -> ApiKeyService:
    return ApiKeyService(
        ApiKeyRepository(db),
        WorkspaceFacadeImpl(WorkspaceRepository(db), MembershipRepository(db)),
    )


@router.post("", response_model=ApiKeyCreatedResponse)
async def create_api_key(
    body: ApiKeyCreate,
    ws: UUID = Path(...),
    user: User = Depends(get_current_user),
    service: ApiKeyService = Depends(get_api_key_service),
):
    ak, raw_key = await service.create(
        workspace_id=ws,
        name=body.name,
        permissions=list(dict.fromkeys(body.permissions or [])),
        user_id=user.id,
    )
    return ApiKeyCreatedResponse(
        id=ak.id,
        name=ak.name,
        key=raw_key,
        key_prefix=ak.key_prefix,
        permissions=ak.permissions,
        created_at=ak.created_at,
    )


@router.get("", response_model=list[ApiKeyResponse])
async def list_api_keys(
    ws: UUID = Path(...),
    user: User = Depends(get_current_user),
    service: ApiKeyService = Depends(get_api_key_service),
):
    keys = await service.list_for_workspace(ws, user.id)
    return [ApiKeyResponse.model_validate(k) for k in keys]


@router.delete("/{id}")
async def revoke_api_key(
    ws: UUID = Path(...),
    id: UUID = Path(...),
    user: User = Depends(get_current_user),
    service: ApiKeyService = Depends(get_api_key_service),
):
    await service.revoke(ws, user.id, id)
    return {"message": "API key revoked"}
