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.appellation.services.sub_appellation import (
    get_sub_appellations,
    create_sub_appellation,
    update_sub_appellation,
    get_sub_appellations_by_id,
    delete_sub_appellation
)
from src.apps.wine.appellation.schemas.sub_appellation import (
    SubAppellationCreateSchema,
    SubAppellationUpdateSchema,
    SubAppellationOutputSchema
)

router = APIRouter(prefix="", tags=["Sub-Appellations"])

@router.get("", response_model=ResponseModel, summary="Get all sub appellations")
async def list_sub_appellations(
    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_sub_appellations(db=db, page=page, per_page=per_page)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Sub-Appellations fetched successfully"
    )
    
@router.post("", response_model=ResponseModel, summary="Create a new sub appellation")
async def create_new_sub_appellation(
    payload: SubAppellationCreateSchema,
    db: Session = Depends(get_db),
):

    data = await create_sub_appellation(db, payload)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_201_CREATED,
        success=True,
        message="Sub-Appellation created successfully"
    )

@router.get("/{sub_appellation_id}", response_model=ResponseModel, summary="Get a sub appellation by ID")
async def get_sub_appellation(
    sub_appellation_id: int,
    db: Session = Depends(get_db),
):
    data = await get_sub_appellations_by_id(db, sub_appellation_id)
    return ResponseModel(
        data=SubAppellationOutputSchema.model_validate(data),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Sub-Appellation fetched successfully"
    )


@router.put("/{sub_appellation_id}", response_model=ResponseModel, summary="Update a sub appellation by ID")
async def update_sub_appellation_by_id(
    sub_appellation_id: int,
    payload: SubAppellationUpdateSchema,
    db: Session = Depends(get_db),
):
    data = await update_sub_appellation(db, sub_appellation_id, payload)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Sub-Appellation updated successfully"
    )
    
@router.delete("/{sub_appellation_id}", response_model=ResponseModel, summary="Delete a sub appellation by ID")
async def delete_sub_appellation_by_id(
    sub_appellation_id: int,
    db: Session = Depends(get_db),
):
    await delete_sub_appellation(db, sub_appellation_id)
    return ResponseModel(
        data={},
        status_code=status.HTTP_204_NO_CONTENT,
        success=True,
        message="Sub-Appellation deleted successfully"
    )