from pydantic import BaseModel, EmailStr, field_validator, ConfigDict
from typing import Optional, List
from datetime import date, datetime
from enum import Enum


class CrewRole(str, Enum):
    CAPTAIN = "Captain"
    FIRST_OFFICER = "First Officer"
    FLIGHT_ATTENDANT = "Flight Attendant"
    PURSER = "Purser"


class CrewStatus(str, Enum):
    ACTIVE = "Active"
    ON_LEAVE = "On Leave"
    INACTIVE = "Inactive"


class AssignmentStatus(str, Enum):
    ASSIGNED = "Assigned"
    CONFIRMED = "Confirmed"
    COMPLETED = "Completed"
    CANCELLED = "Cancelled"


# Crewmember schemas
class CrewmemberBase(BaseModel):
    employee_number: str
    first_name: str
    last_name: str
    email: EmailStr
    phone: str
    date_of_birth: date
    hire_date: date
    role: str
    certification_number: Optional[str] = None
    certification_expiry: Optional[date] = None
    status: str = "Active"

    @field_validator("employee_number")
    @classmethod
    def validate_employee_number(cls, v: str) -> str:
        if not v or len(v.strip()) == 0:
            raise ValueError("Employee number is required")
        return v


class CrewmemberCreate(CrewmemberBase):
    pass


class CrewmemberUpdate(BaseModel):
    employee_number: Optional[str] = None
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    email: Optional[EmailStr] = None
    phone: Optional[str] = None
    date_of_birth: Optional[date] = None
    hire_date: Optional[date] = None
    role: Optional[str] = None
    certification_number: Optional[str] = None
    certification_expiry: Optional[date] = None
    status: Optional[str] = None


class CrewmemberResponse(CrewmemberBase):
    id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


# Flightcrewassignment schemas
class FlightcrewassignmentBase(BaseModel):
    flight_id: str
    crew_member_id: str
    assigned_role: str
    assignment_status: str = "Assigned"
    notes: Optional[str] = None


class FlightcrewassignmentCreate(FlightcrewassignmentBase):
    pass


class FlightcrewassignmentUpdate(BaseModel):
    flight_id: Optional[str] = None
    crew_member_id: Optional[str] = None
    assigned_role: Optional[str] = None
    assignment_status: Optional[str] = None
    notes: Optional[str] = None


class FlightcrewassignmentResponse(FlightcrewassignmentBase):
    id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


# Detail response schemas
class FlightRouteAirportDetail(BaseModel):
    code: str
    name: str
    city: str

    model_config = ConfigDict(from_attributes=True)


class FlightRouteDetail(BaseModel):
    origin_airport: FlightRouteAirportDetail
    destination_airport: FlightRouteAirportDetail

    model_config = ConfigDict(from_attributes=True)


class FlightAssignmentDetail(BaseModel):
    flight_number: str
    scheduled_departure: datetime
    scheduled_arrival: datetime
    route: FlightRouteDetail

    model_config = ConfigDict(from_attributes=True)


class FlightcrewassignmentDetail(BaseModel):
    id: str
    assigned_role: str
    assignment_status: str
    notes: Optional[str]
    flight: FlightAssignmentDetail
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)


class CrewmemberDetailResponse(CrewmemberResponse):
    flight_crew_assignments: List[FlightcrewassignmentDetail]

    model_config = ConfigDict(from_attributes=True)