import uuid

from fastapi import APIRouter, Depends, File, Form, UploadFile
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.dependencies import get_current_user
from app.core.responses import api_response, normalize_page_param, page_response
from app.db.database import get_async_session
from app.schemas.ressource import RessourceCreate, RessourceUpdate
from app.services.ressource_service import RessourceService

router = APIRouter(prefix="/ressources", tags=["Ressources"])


@router.post("/upload", status_code=201)
async def upload_ressource(
    file: UploadFile = File(...),
    categorie: str | None = Form(default=None),
    titre: str | None = Form(default=None),
    description: str | None = Form(default=None),
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(get_current_user),
):
    service = RessourceService(db)
    data = await service.upload_and_create(
        file=file,
        current_user=current_user,
        titre=titre,
        description=description,
        categorie=categorie,
    )
    return api_response(data, message="Ressource uploadee", status_code=201)


@router.post("/", status_code=201)
async def create_ressource_metadata(
    body: RessourceCreate,
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(get_current_user),
):
    service = RessourceService(db)
    data = await service.create_metadata(body, current_user)
    return api_response(data, message="Ressource creee", status_code=201)


@router.get("/")
async def list_ressources(
    page: int = 1,
    size: int = 20,
    categorie: str | None = None,
    search: str | None = None,
    sort: str | None = None,
    order: str | None = None,
    db: AsyncSession = Depends(get_async_session),
    _current_user=Depends(get_current_user),
):
    resolved_page = normalize_page_param(page)
    service = RessourceService(db)
    items, total = await service.list_ressources(
        page=resolved_page,
        size=size,
        categorie=categorie,
        search=search,
        sort=sort,
        order=order,
    )
    return page_response(items, total=total, page=resolved_page, size=size)


@router.get("/{resource_id}")
async def get_ressource(
    resource_id: uuid.UUID,
    db: AsyncSession = Depends(get_async_session),
    _current_user=Depends(get_current_user),
):
    service = RessourceService(db)
    data = await service.get_ressource(str(resource_id))
    return api_response(data, message="Ressource recuperee")


@router.delete("/{resource_id}")
async def delete_ressource(
    resource_id: uuid.UUID,
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(get_current_user),
):
    service = RessourceService(db)
    data = await service.delete_ressource(str(resource_id), current_user)
    return api_response(data, message="Ressource supprimee")


@router.put("/{resource_id}")
async def update_ressource(
    resource_id: uuid.UUID,
    body: RessourceUpdate,
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(get_current_user),
):
    service = RessourceService(db)
    data = await service.update_ressource(resource_id, body, current_user)
    return api_response(data, message="Ressource mise a jour")
