from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.params import Path, Query
from sqlalchemy.orm import Session
from src.apps.web_crawler.schemas.work_group import (
    WorkGroupCreateSchema,
    WorkGroupFilterSchema,
    WorkGroupOutputSchema,
    WorkGroupUpdateSchema
)
from src.apps.web_crawler.services.work_group import (
    create_work_group_service,
    delete_work_group_service,
    update_work_group_service,
    get_all_work_groups_service,
    get_work_group_by_id_service
)
from src.core.dependencies import get_db
from src.utils import constants
from src.utils.guard import get_current_user
from src.apps.base.schemas.response_model import ResponseModel

router = APIRouter()


@router.get("", response_model=ResponseModel, summary="Get all work groups")
async def get_all_work_groups_list(
    payload: WorkGroupFilterSchema = Depends(),
    sort_by: str = Query(
        default="-created_at",
        description=(
            "Sort by fields, prefix with '-' for descending order. "
            "Allowed fields: name, created_at, updated_at., id. "
            "Multiple fields can be separated by commas."
        ),
    ),
    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",
    ),
    paginated: bool = Query(
        default=True,
        description="Whether to paginate the results. If false, all results will be returned.",
    ),
    db: Session = Depends(get_db),
):
    response= await get_all_work_groups_service(
        db=db, 
        page=page, 
        per_page=per_page, 
        payload=payload, 
        sort_by=sort_by.split(",") if sort_by else [],
        paginated=paginated
    )
    return ResponseModel(
        data=response, 
        status_code=status.HTTP_200_OK, 
        success=True,
        message="Record fetched successfully"
    )
    
@router.post("", response_model=ResponseModel, summary="Create a new work group")
async def create_work_group(
    payload: WorkGroupCreateSchema,
    db: Session = Depends(get_db),
):
    data = await create_work_group_service(db, payload)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_201_CREATED,
        success=True,
        message="Record created successfully"
    )
    
@router.get("/{work_group_id}", response_model=ResponseModel, summary="Get work group by ID")
async def get_work_group_by_id(
    work_group_id: int = Path(..., description="ID of the work group to retrieve"),
    db: Session = Depends(get_db),
):
    work_group = await get_work_group_by_id_service(db, work_group_id)
    return ResponseModel(
        data=WorkGroupOutputSchema.model_validate(work_group),
        status_code=status.HTTP_200_OK,
        success=True,
        message="Record fetched successfully"
    )
    
@router.put("/{work_group_id}", response_model=ResponseModel, summary="Update a work group by ID")
async def update_work_group(
    payload: WorkGroupUpdateSchema,
    work_group_id: int = Path(..., description="ID of the work group to update"),
    db: Session = Depends(get_db),
):
    data = await update_work_group_service(db, work_group_id, payload)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Record updated successfully"
    )
    
@router.delete("/{work_group_id}", response_model=ResponseModel, summary="Soft Delete a work group by ID")
async def delete_work_group(
    work_group_id: int = Path(..., description="ID of the work group to delete"),
    db: Session = Depends(get_db),
):
    data = await delete_work_group_service(db, work_group_id)
    return ResponseModel(
        data=data,
        status_code=status.HTTP_200_OK,
        success=True,
        message="Record deleted successfully"
    )