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

from src.apps.base.schemas.response_model import ResponseModel
from src.apps.base.schemas.country import (
    CountryOutSchema,
    CountryCreateSchema,
    CountryUpdateSchema,
)
from src.apps.base.services import country as country_service
from src.core.dependencies import get_db
from src.utils import constants

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


@router.get("", response_model=ResponseModel, summary="Get all countries with pagination")
async def list_countries(
    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 = await country_service.get_all_countries(
        db=db,
        page=page,
        per_page=per_page
    )
    return ResponseModel(
        data=paginated_data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Countries fetched successfully"
    )


@router.get("/{country_id}", response_model=ResponseModel, summary="Get country by id")
async def get_country(
    country_id: int,
    db: Session = Depends(get_db),
):
    country = await country_service.get_country_by_id(db, country_id)
    return ResponseModel(
        data=CountryOutSchema.from_orm(country),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Country fetched successfully"
    )


@router.post("", response_model=ResponseModel, status_code=status.HTTP_201_CREATED, summary="Create country")
async def create_country(
    payload: CountryCreateSchema,
    db: Session = Depends(get_db),
):
    created_country = await country_service.create_country(db, payload)
    return ResponseModel(
        data=CountryOutSchema.from_orm(created_country),
        status_code=status.HTTP_201_CREATED,
        success=True,
        message="Country created successfully"
    )


@router.put("/{country_id}", response_model=ResponseModel, summary="Update country")
async def update_country(
    country_id: int,
    payload: CountryUpdateSchema,
    db: Session = Depends(get_db),
):
    updated_country = await country_service.update_country(db=db, country_id=country_id, payload=payload)
    return ResponseModel(
        data=CountryOutSchema.from_orm(updated_country),
        status_code=200,
        success=True,
        message="Country updated successfully"
    )


@router.delete("/{country_id}", response_model=ResponseModel, status_code=status.HTTP_200_OK, summary="Delete country")
async def delete_country(
    country_id: int,
    db: Session = Depends(get_db),
):
    await country_service.delete_country(db, country_id)
    return ResponseModel(
        data={},
        status_code=200,
        success=True,
        message="Country deleted successfully"
    )
