from typing import Optional
from uuid import UUID

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

from src.apps.base.schemas.region import (
    RegionCreateSchema,
    RegionOutSchema,
    RegionUpdateSchema,
    SubRegionCreateSchema,
    SubRegionOutSchema,
    SubRegionUpdateSchema,
    SubRegionFilterSchema,
    RegionFilterSchema
)
from src.apps.base.schemas.response_model import ResponseModel
from src.apps.base.services import region as region_service
from src.core.dependencies import get_db
from src.core.exceptions import APIException
from src.utils import constants

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


@router.get("", response_model=ResponseModel, summary="Get all sub-regions with pagination")
async def list_sub_regions(
    page: int = Query(default=1, ge=1),
    per_page: int = Query(default=constants.DEFAULT_PER_PAGE, ge=1, le=constants.MAX_PER_PAGE),
    db: Session = Depends(get_db),
    payload: SubRegionFilterSchema = Depends(),
):
    data = await region_service.get_all_sub_regions(db=db, page=page, per_page=per_page, payload=payload)
    return ResponseModel(
        data=data, 
        status_code=status.HTTP_200_OK, 
        success=True, 
        message="Sub-regions fetched successfully"
    )

@router.post(
    "", response_model=ResponseModel, status_code=status.HTTP_201_CREATED, summary="Create sub-region"
)
async def create_sub_region(payload: SubRegionCreateSchema, db: Session = Depends(get_db)):
    created = await region_service.create_sub_region(db, payload)
    return ResponseModel(
        data=SubRegionOutSchema.from_orm(created),
        status_code=status.HTTP_201_CREATED,
        success=True,
        message="Sub-region created successfully",
    )

@router.get("/{sub_region_id}", response_model=ResponseModel, summary="Get sub-region by id")
async def get_sub_region(sub_region_id: int, db: Session = Depends(get_db)):
    sub_region = await region_service.get_sub_region_by_id(db, sub_region_id)
    return ResponseModel(
        data=SubRegionOutSchema.from_orm(sub_region),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Sub-region fetched successfully",
    )

@router.put("/{sub_region_id}", response_model=ResponseModel, summary="Update sub-region")
async def update_sub_region(sub_region_id: int, payload: SubRegionUpdateSchema, db: Session = Depends(get_db)):
    updated = await region_service.update_sub_region(db, sub_region_id, payload)
    return ResponseModel(
        data=SubRegionOutSchema.from_orm(updated),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Sub-region updated successfully",
    )

@router.delete("/{sub_region_id}", response_model=ResponseModel, summary="Delete sub-region")
async def delete_sub_region(sub_region_id: int, db: Session = Depends(get_db)):
    await region_service.delete_sub_region(db, sub_region_id)
    return ResponseModel(
        data={}, 
        status_code=status.HTTP_200_OK, 
        success=True, 
        message="Sub-region deleted successfully"
    )
