from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional
from utils.utils import get_db
from . import handler
from .schema import (
    ChecklistCreate,
    ChecklistUpdate,
    ChecklistResponse,
    ChecklistListResponse,
    ChecklistitemCreate,
    ChecklistitemUpdate,
    ChecklistitemResponse,
    ChecklistitemListResponse,
)

router = APIRouter(prefix="/checklists", tags=["Checklists"])


@router.post(
    "/",
    response_model=ChecklistResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Checklist",
    description="Creates a new checklist for a job. Validates that the referenced job exists. Returns 404 if job not found.",
)
def create_checklist_route(data: ChecklistCreate, db: Session = Depends(get_db)):
    return handler.create_checklist(db, data)


@router.get(
    "/",
    response_model=ChecklistListResponse,
    summary="List Checklists",
    description="Returns a paginated list of checklists. Supports optional filtering by job_id. Ordered by display_order and creation date.",
)
def list_checklists_route(
    limit: int = Query(20, ge=1),
    offset: int = Query(0, ge=0),
    job_id: Optional[str] = None,
    db: Session = Depends(get_db),
):
    return handler.list_checklists(db, limit, offset, job_id=job_id)


@router.get(
    "/{checklist_id}",
    response_model=ChecklistResponse,
    summary="Get Checklist",
    description="Retrieves a single checklist by ID. Returns 404 if checklist not found.",
)
def get_checklist_route(checklist_id: str, db: Session = Depends(get_db)):
    return handler.get_checklist(db, checklist_id)


@router.put(
    "/{checklist_id}",
    response_model=ChecklistResponse,
    summary="Update Checklist",
    description="Updates an existing checklist. Validates referenced job if job_id is updated. Returns 404 if checklist not found, 400 if job not found.",
)
def update_checklist_route(
    checklist_id: str, data: ChecklistUpdate, db: Session = Depends(get_db)
):
    return handler.update_checklist(db, checklist_id, data)


@router.delete(
    "/{checklist_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Checklist",
    description="Deletes a checklist and cascades to all checklist items. Returns 404 if checklist not found, 409 if deletion would violate constraints.",
)
def delete_checklist_route(checklist_id: str, db: Session = Depends(get_db)):
    return handler.delete_checklist(db, checklist_id)


@router.post(
    "/items",
    response_model=ChecklistitemResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Checklist Item",
    description="Creates a new checklist item within a checklist. Validates that the referenced checklist and optional assigned user exist. Returns 404 if checklist not found, 400 if assigned user not found.",
)
def create_checklist_item_route(data: ChecklistitemCreate, db: Session = Depends(get_db)):
    return handler.create_checklist_item(db, data)


@router.get(
    "/items",
    response_model=ChecklistitemListResponse,
    summary="List Checklist Items",
    description="Returns a paginated list of checklist items. Supports optional filtering by checklist_id, is_completed, and assigned_to_user_id. Ordered by display_order and creation date.",
)
def list_checklist_items_route(
    limit: int = Query(20, ge=1),
    offset: int = Query(0, ge=0),
    checklist_id: Optional[str] = None,
    is_completed: Optional[bool] = None,
    assigned_to_user_id: Optional[str] = None,
    db: Session = Depends(get_db),
):
    return handler.list_checklist_items(
        db, limit, offset, checklist_id=checklist_id, is_completed=is_completed, assigned_to_user_id=assigned_to_user_id
    )


@router.get(
    "/items/{checklist_item_id}",
    response_model=ChecklistitemResponse,
    summary="Get Checklist Item",
    description="Retrieves a single checklist item by ID. Returns 404 if checklist item not found.",
)
def get_checklist_item_route(checklist_item_id: str, db: Session = Depends(get_db)):
    return handler.get_checklist_item(db, checklist_item_id)


@router.put(
    "/items/{checklist_item_id}",
    response_model=ChecklistitemResponse,
    summary="Update Checklist Item",
    description="Updates an existing checklist item. Validates referenced checklist and optional assigned user if updated. Returns 404 if checklist item not found, 400 if referenced entities not found.",
)
def update_checklist_item_route(
    checklist_item_id: str, data: ChecklistitemUpdate, db: Session = Depends(get_db)
):
    return handler.update_checklist_item(db, checklist_item_id, data)


@router.delete(
    "/items/{checklist_item_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Checklist Item",
    description="Deletes a checklist item. Returns 404 if checklist item not found, 409 if deletion would violate constraints.",
)
def delete_checklist_item_route(checklist_item_id: str, db: Session = Depends(get_db)):
    return handler.delete_checklist_item(db, checklist_item_id)


@router.post(
    "/items/{checklist_item_id}/complete",
    response_model=ChecklistitemResponse,
    summary="Complete Checklist Item",
    description="Marks a checklist item as completed and records the completion timestamp. Returns 404 if checklist item not found, 400 if already completed.",
)
def complete_checklist_item_route(checklist_item_id: str, db: Session = Depends(get_db)):
    return handler.complete_checklist_item(db, checklist_item_id)