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 import constants
from src.core.dependencies import get_db
from src.utils.constants import MAX_PER_PAGE
from typing import Optional
from src.apps.wine.variety.services.variety import get_varieties,create_variety,update_variety,get_variety_by_id,delete_variety
from src.apps.wine.variety.schemas.variety import VarietyUpdateSchema,VarietyCreateSchema,VarietyOutputSchema as VarietyOutSchema

router = APIRouter(prefix="", tags=["Varieties"])

@router.get("", response_model=ResponseModel, summary="Get all variety without pagination")
async def list_varieties(
    db: Session = Depends(get_db),
    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",
    ),
):
    data = await get_varieties(db=db, page=page, per_page=per_page)
    return ResponseModel(
        data=data,
        status_code=200,
        success=True,
        message="Varieties fetched successfully"
    )
    
@router.post("", response_model=ResponseModel, summary="Create a new variety")
async def create_new_variety(
    variety_data: VarietyCreateSchema,
    db: Session = Depends(get_db),
):

    created_variety = await create_variety(db, variety_data)
    return ResponseModel(
        data=created_variety,
        status_code=status.HTTP_201_CREATED,
        success=True,
        message="Variety created successfully"
    )

@router.get("/{variety_id}", response_model=ResponseModel, summary="Get a variety by ID")
async def get_variety(
    variety_id: int,
    db: Session = Depends(get_db),
):
    """
    Get a variety by its ID.
    """
    data = await get_variety_by_id(db, variety_id)
    return ResponseModel(
        data=VarietyOutSchema.model_validate(data),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Variety fetched successfully"
    )


@router.put("/{variety_id}", response_model=ResponseModel, summary="Update a variety by ID")
async def update_existing_variety(
    variety_id: int,
    variety_data: VarietyUpdateSchema,
    db: Session = Depends(get_db),
):
    """
    Update an existing variety by ID.
    """
    data = await update_variety(db, variety_id, variety_data)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Variety updated successfully"
    )

@router.delete("/{variety_id}", response_model=ResponseModel, summary="Soft Delete a variety by ID")
async def delete_variety_by_id(
    variety_id: int,
    db: Session = Depends(get_db),
):
    """
    Delete a variety by its ID.
    """
    await delete_variety(db, variety_id)
    return ResponseModel(
        data={},
        status_code=status.HTTP_204_NO_CONTENT,
        success=True,
        message="Variety deleted successfully"
    )
    
    
    