from fastapi import UploadFile, File as FastAPIFile, Form, APIRouter, Depends, HTTPException, status, Query
from sqlalchemy.orm import Session
from typing import Any

from src.apps.base.schemas.response_model import ResponseModel
from src.apps.files.schemas.file import (
    FileResponseSchema,
    FileCreateSchema,
    FileUpdateSchema,
)
from src.apps.files.services import file as file_service
from src.core.dependencies import get_db
from src.utils import constants

router = APIRouter(prefix="/files", tags=["Files"])


@router.get("", response_model=ResponseModel, summary="Get all files with pagination")
def list_files(
    page: int = Query(default=1, ge=1, description="Page number to fetch"),
    per_page: int = Query(
        default=constants.DEFAULT_PER_PAGE,
        ge=1,
        le=constants.MAX_PER_PAGE,
        description="Number of items per page"
    ),
    db: Session = Depends(get_db),
):
    paginated_data = file_service.get_all_files(
        db=db,
        page=page,
        per_page=per_page
    )
    return ResponseModel(
        data=paginated_data,
        status_code=200,
        success=True,
        message="Files fetched successfully"
    )


@router.get("/{file_id}", response_model=ResponseModel, summary="Get file by ID")
def get_file(
    file_id: int,
    db: Session = Depends(get_db),
):
    file_obj = file_service.get_file_by_id(db, file_id)
    return ResponseModel(
        data=FileResponseSchema.model_validate(file_obj),
        status_code=200,
        success=True,
        message="File fetched successfully"
    )


@router.post("", response_model=ResponseModel, status_code=status.HTTP_201_CREATED, summary="Create file")
async def create_file(
    created_by_id: int = Form(..., description="Uploader user ID"),
    file: UploadFile = FastAPIFile(..., description="File to upload"),
    db: Session = Depends(get_db),
):
    created_file = await file_service.create_file(db, created_by_id, file)
    return ResponseModel(
        data=FileResponseSchema.model_validate(created_file),
        status_code=201,
        success=True,
        message="File uploaded and created successfully"
    )


@router.put("/{file_id}", response_model=ResponseModel, summary="Update file")
def update_file(
    file_id: int,
    payload: FileUpdateSchema,
    db: Session = Depends(get_db),
):
    updated_file = file_service.update_file(db, file_id, payload)
    return ResponseModel(
        data=FileResponseSchema.model_validate(updated_file),
        status_code=200,
        success=True,
        message="File updated successfully"
    )


@router.delete("/{file_id}", response_model=ResponseModel, status_code=status.HTTP_200_OK, summary="Delete file")
def delete_file(
    file_id: int,
    db: Session = Depends(get_db),
):
    file_service.delete_file(db, file_id)
    return ResponseModel(
        data={},
        status_code=200,
        success=True,
        message="File deleted successfully"
    )
