from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional, List
from datetime import date
from utils.utils import get_db
from . import handler
from .schema import (
    CrewmemberCreate,
    CrewmemberUpdate,
    CrewmemberResponse,
    CrewmemberDetailResponse,
    FlightcrewassignmentCreate,
    FlightcrewassignmentUpdate,
    FlightcrewassignmentResponse,
)

router = APIRouter(prefix="/crew-management", tags=["Crew Management"])


# Crewmember routes
@router.post(
    "/crew-members",
    response_model=CrewmemberResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Crew Member",
    description="Creates a new crew member record with personal details, role, and certification information. Returns 409 if employee number or email already exists.",
)
def create_crew_member_route(data: CrewmemberCreate, db: Session = Depends(get_db)):
    return handler.create_crew_member(db, data)


@router.get(
    "/crew-members",
    response_model=List[CrewmemberResponse],
    summary="List Crew Members",
    description="Returns a paginated list of crew members. Supports optional filters for search (name, email, employee number), status, and role.",
)
def list_crew_members_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    search: Optional[str] = None,
    status: Optional[str] = None,
    role: Optional[str] = None,
    db: Session = Depends(get_db),
):
    return handler.list_crew_members(db, limit, offset, search, status, role)


@router.get(
    "/crew-members/{crew_member_id}",
    response_model=CrewmemberResponse,
    summary="Get Crew Member",
    description="Returns detailed information for a specific crew member by ID. Returns 404 if crew member not found.",
)
def get_crew_member_route(crew_member_id: str, db: Session = Depends(get_db)):
    return handler.get_crew_member(db, crew_member_id)


@router.put(
    "/crew-members/{crew_member_id}",
    response_model=CrewmemberResponse,
    summary="Update Crew Member",
    description="Updates crew member information. Only provided fields are updated. Returns 404 if crew member not found, 409 if employee number or email conflicts with existing record.",
)
def update_crew_member_route(
    crew_member_id: str,
    data: CrewmemberUpdate,
    db: Session = Depends(get_db),
):
    return handler.update_crew_member(db, crew_member_id, data)


@router.delete(
    "/crew-members/{crew_member_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Crew Member",
    description="Deletes a crew member record. Returns 400 if crew member has active flight assignments, 404 if crew member not found.",
)
def delete_crew_member_route(crew_member_id: str, db: Session = Depends(get_db)):
    return handler.delete_crew_member(db, crew_member_id)


@router.get(
    "/crew-members/{crew_member_id}/details",
    response_model=CrewmemberDetailResponse,
    summary="Get Crew Member Details",
    description="Returns comprehensive crew member information including all flight assignments with flight details, routes, and airports. Returns 404 if crew member not found.",
)
def get_crew_member_details_route(crew_member_id: str, db: Session = Depends(get_db)):
    return handler.get_crew_member_details(db, crew_member_id)


@router.get(
    "/crew-members/{crew_member_id}/schedule",
    response_model=List[FlightcrewassignmentResponse],
    summary="Get Crew Member Schedule",
    description="Returns all flight assignments for a crew member within the specified date range. Returns 400 if start date is after end date, 404 if crew member not found.",
)
def get_crew_member_schedule_route(
    crew_member_id: str,
    start_date: date = Query(..., description="Schedule start date"),
    end_date: date = Query(..., description="Schedule end date"),
    db: Session = Depends(get_db),
):
    return handler.get_crew_member_schedule(db, crew_member_id, start_date, end_date)


# Flightcrewassignment routes
@router.post(
    "/flight-crew-assignments",
    response_model=FlightcrewassignmentResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Flight Crew Assignment",
    description="Assigns a crew member to a flight with validation for crew availability, certification validity, and rest period requirements. Returns 400 for validation failures, 404 if flight or crew member not found, 409 if crew member already assigned or has overlapping assignments.",
)
def create_flight_crew_assignment_route(
    data: FlightcrewassignmentCreate,
    db: Session = Depends(get_db),
):
    return handler.create_flight_crew_assignment(db, data)


@router.get(
    "/flight-crew-assignments",
    response_model=List[FlightcrewassignmentResponse],
    summary="List Flight Crew Assignments",
    description="Returns a paginated list of flight crew assignments. Supports optional filters for flight ID, crew member ID, assignment status, and assigned role.",
)
def list_flight_crew_assignments_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    flight_id: Optional[str] = None,
    crew_member_id: Optional[str] = None,
    assignment_status: Optional[str] = None,
    assigned_role: Optional[str] = None,
    db: Session = Depends(get_db),
):
    return handler.list_flight_crew_assignments(
        db, limit, offset, flight_id, crew_member_id, assignment_status, assigned_role
    )


@router.get(
    "/flight-crew-assignments/{assignment_id}",
    response_model=FlightcrewassignmentResponse,
    summary="Get Flight Crew Assignment",
    description="Returns detailed information for a specific flight crew assignment by ID. Returns 404 if assignment not found.",
)
def get_flight_crew_assignment_route(assignment_id: str, db: Session = Depends(get_db)):
    return handler.get_flight_crew_assignment(db, assignment_id)


@router.put(
    "/flight-crew-assignments/{assignment_id}",
    response_model=FlightcrewassignmentResponse,
    summary="Update Flight Crew Assignment",
    description="Updates flight crew assignment information. Only provided fields are updated. Validates crew member status if crew member is changed. Returns 404 if assignment or crew member not found, 400 if crew member is not active.",
)
def update_flight_crew_assignment_route(
    assignment_id: str,
    data: FlightcrewassignmentUpdate,
    db: Session = Depends(get_db),
):
    return handler.update_flight_crew_assignment(db, assignment_id, data)


@router.delete(
    "/flight-crew-assignments/{assignment_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Flight Crew Assignment",
    description="Deletes a flight crew assignment. Returns 400 if assignment is already completed, 404 if assignment not found.",
)
def delete_flight_crew_assignment_route(assignment_id: str, db: Session = Depends(get_db)):
    return handler.delete_flight_crew_assignment(db, assignment_id)