from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.params import Path, Query
from sqlalchemy.orm import Session
from src.apps.wine.wine_log.models.wine_log import JobLog
from src.apps.wine.wine_log.schemas.job_log import (
    JobLogCreateSchema,
    JobLogFilterSchema,
    JobLogOutputSchema,
    JobLogSchema,
    JobLogUpdateSchema,
)
from src.apps.wine.wine_log.services.job_log import (
    create_job_log_service,
    get_all_job_logs_service,
    get_job_log_by_id_service,
    update_job_log_service,
    delete_job_log_service
)
from src.core.dependencies import get_db
from src.utils import constants
from src.utils.guard import get_current_user
from src.apps.base.schemas.response_model import ResponseModel

router = APIRouter()


@router.get("", response_model=ResponseModel, summary="Get all job logs")
async def get_all_job_logs(
    payload: JobLogFilterSchema = Depends(),
    sort_by: str = Query(
        default="-date_created",
        description=(
            "Sort by fields, prefix with '-' for descending order. "
            "Allowed fields: code, name, total_records, total_prices, job_date, date_start, date_end, date_created, last_updated. "
            "Multiple fields can be separated by commas."
        ),
    ),
    page: int = Query(default=1, ge=1, description="Page number"),
    per_page: int = Query(
        default=constants.DEFAULT_PER_PAGE,
        ge=1,
        le=constants.MAX_PER_PAGE,
        description="Items per page",
    ),
    db: Session = Depends(get_db),
):
    response= await get_all_job_logs_service(
        db, page=page, per_page=per_page, payload=payload, sort_by=sort_by.split(",") if sort_by else []
    )
    return ResponseModel(
        data=response, 
        status_code=status.HTTP_200_OK, 
        success=True,
        message="Record fetched successfully"
    )
    
@router.post("", response_model=ResponseModel, summary="Create a new job log")
async def create_job_log(
    payload: JobLogCreateSchema,
    db: Session = Depends(get_db),
):
    data = await create_job_log_service(db, payload)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_201_CREATED,
        success=True,
        message="Job log created successfully"
    )

@router.get("/{job_log_id}", response_model=ResponseModel, summary="Get job log by ID")
async def get_job_log_by_id(
    job_log_id: int = Path(..., description="ID of the job log to retrieve"),
    db: Session = Depends(get_db),
):
    job_log = await get_job_log_by_id_service(db, job_log_id)
    return ResponseModel(
        data=JobLogOutputSchema.model_validate(job_log),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Job log fetched successfully"
    )

@router.put("/{job_log_id}", response_model=ResponseModel, summary="Update job log by ID")
async def update_job_log(
    payload: JobLogUpdateSchema,
    job_log_id: int = Path(..., description="ID of the job log to update"),
    db: Session = Depends(get_db),
):
    data = await update_job_log_service(db, job_log_id, payload)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Job log updated successfully"
    )
    
    
@router.delete("/{job_log_id}", response_model=ResponseModel, summary="Soft Delete job log by ID")
async def delete_job_log(
    job_log_id: int = Path(..., description="ID of the job log to delete"),
    db: Session = Depends(get_db),
):
    data = await delete_job_log_service(db, job_log_id)
    return ResponseModel(
        data={},
        status_code=status.HTTP_204_NO_CONTENT,
        success=True,
        message="Job log deleted successfully"
    )
    
