from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from uuid import UUID

from src.apps.base.schemas.response_model import ResponseModel
from src.utils.constants import MAX_PER_PAGE
from src.core.dependencies import get_db
from src.utils import constants
from typing import Optional
from src.apps.wine.producer.schemas.producer import ProducerFilterSchema,ProducerSchema,ProducerUpdateSchema,ProducerCreateSchema
from src.apps.wine.producer.schemas.producer import ProducerOutputSchema
from src.apps.wine.producer.services.producer import get_producers,get_producer_by_id as get_producer_by_id_service,update_producer as update_producer_service,create_producer as create_producer_service,get_literal_by_reg_code as get_literal_by_reg_code_service

router = APIRouter(prefix="", tags=["Producers"])
    
@router.get("", response_model=ResponseModel, summary="Get all producer pagination")
async def list_all_wine_dbs(
    db: Session = Depends(get_db),
    payload: ProducerFilterSchema = Depends(),
    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",
    ),
):
    producers = await get_producers(
        db=db,
        payload=payload,
        page=page,
        per_page=per_page
    )
    
    return ResponseModel(
        data=producers,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Producers fetched successfully"
    )

@router.get("/literal-by-reg-code", response_model=ResponseModel, summary="Get literal by reg_code")
async def get_literal_by_reg_code(
    reg_code: str = Query(...),
    db: Session = Depends(get_db),
):
    data = await get_literal_by_reg_code_service(db, reg_code)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Literal fetched successfully"
    )
    
@router.get("/{producer_id}", response_model=ResponseModel, summary="Get a producer by ID")
async def get_producer_by_id(
    producer_id: int,
    db: Session = Depends(get_db),
):
    data = await get_producer_by_id_service(db, producer_id=producer_id)
    return ResponseModel(
        data=ProducerSchema.model_validate(data),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Producer fetched successfully"
    )
    
@router.put("/{producer_id}", response_model=ResponseModel, summary="Update a producer by ID")
async def update_producer(
    producer_id: int,
    payload: ProducerUpdateSchema,
    db: Session = Depends(get_db),
):
    data = await update_producer_service(db, producer_id=producer_id, payload=payload)
    return ResponseModel(
        data=ProducerSchema.model_validate(data),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Producer updated successfully"
    )
    
@router.post("", response_model=ResponseModel, summary="Create a new producer")
async def create_producer(
    payload: ProducerCreateSchema,
    db: Session = Depends(get_db),
):
    data = await create_producer_service(db, payload=payload)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_201_CREATED,
        success=True,
        message="Producer created successfully"
    )

