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=["Regions"])

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


@router.get("/{region_id}", response_model=ResponseModel, summary="Get region by id")
async def get_region(region_id: int, db: Session = Depends(get_db)):
    region = await region_service.get_region_by_id(db, region_id)
    return ResponseModel(
        data=RegionOutSchema.from_orm(region), 
        status_code=status.HTTP_200_OK, 
        success=True, 
        message="Region fetched successfully"
    )


@router.post("", response_model=ResponseModel, status_code=status.HTTP_201_CREATED, summary="Create region")
async def create_region(payload: RegionCreateSchema, db: Session = Depends(get_db)):
    created = await region_service.create_region(db, payload)
    return ResponseModel(
        data=RegionOutSchema.from_orm(created), 
        status_code=status.HTTP_201_CREATED, 
        success=True, 
        message="Region created successfully"
    )


@router.put("/{region_id}", response_model=ResponseModel, summary="Update region")
async def update_region(region_id: int, payload: RegionUpdateSchema, db: Session = Depends(get_db)):
    updated = await region_service.update_region(db, region_id, payload)
    return ResponseModel(
        data=RegionOutSchema.from_orm(updated), 
        status_code=status.HTTP_200_OK, 
        success=True, 
        message="Region updated successfully"
    )


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