"""
Lab management endpoints.

CRUD operations for tenant laboratories.
"""

from uuid import UUID

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

from app.core.auth_deps import require_permission
from app.core.dependencies import get_db
from app.core.pagination import PaginationParams
from app.core.permissions import PermissionCode
from app.core.responses import PaginatedResponse, SuccessResponse
from app.schemas.lab import LabCreate, LabResponse, LabUpdate
from app.services.lab_service import LabService

router = APIRouter(prefix="/labs", tags=["Labs"])
_lab_service = LabService()


@router.get(
    "",
    response_model=PaginatedResponse[LabResponse],
    status_code=status.HTTP_200_OK,
    summary="List laboratories",
    description="Retrieve paginated list of active laboratories.",
    dependencies=[Depends(require_permission(PermissionCode.LAB_READ))],
)
async def list_labs(
    params: PaginationParams = Depends(),
    db: AsyncSession = Depends(get_db),
) -> PaginatedResponse[LabResponse]:
    return await _lab_service.list_labs(db, params)


@router.post(
    "",
    response_model=SuccessResponse[LabResponse],
    status_code=status.HTTP_201_CREATED,
    summary="Create laboratory",
    description="Create a new laboratory tenant.",
    dependencies=[Depends(require_permission(PermissionCode.LAB_WRITE))],
)
async def create_lab(
    payload: LabCreate,
    db: AsyncSession = Depends(get_db),
) -> SuccessResponse[LabResponse]:
    lab = await _lab_service.create_lab(db, payload)
    return SuccessResponse(data=lab)


@router.get(
    "/{lab_id}",
    response_model=SuccessResponse[LabResponse],
    status_code=status.HTTP_200_OK,
    summary="Get laboratory details",
    description="Retrieve details of a specific laboratory by ID.",
    dependencies=[Depends(require_permission(PermissionCode.LAB_READ))],
)
async def get_lab(
    lab_id: UUID,
    db: AsyncSession = Depends(get_db),
) -> SuccessResponse[LabResponse]:
    lab = await _lab_service.get_lab(db, lab_id)
    return SuccessResponse(data=lab)


@router.patch(
    "/{lab_id}",
    response_model=SuccessResponse[LabResponse],
    status_code=status.HTTP_200_OK,
    summary="Update laboratory",
    description="Update settings or information for a laboratory.",
    dependencies=[Depends(require_permission(PermissionCode.LAB_WRITE))],
)
async def update_lab(
    lab_id: UUID,
    payload: LabUpdate,
    db: AsyncSession = Depends(get_db),
) -> SuccessResponse[LabResponse]:
    lab = await _lab_service.update_lab(db, lab_id, payload)
    return SuccessResponse(data=lab)


@router.delete(
    "/{lab_id}",
    response_model=SuccessResponse[dict[str, str]],
    status_code=status.HTTP_200_OK,
    summary="Delete laboratory",
    description="Deactivate or delete a laboratory.",
    dependencies=[Depends(require_permission(PermissionCode.LAB_WRITE))],
)
async def delete_lab(
    lab_id: UUID,
    db: AsyncSession = Depends(get_db),
) -> SuccessResponse[dict[str, str]]:
    await _lab_service.delete_lab(db, lab_id)
    return SuccessResponse(data={"message": f"Laboratory '{lab_id}' deleted successfully."})
