"""
Driver Schemas
Driver profile, verification, and location management
"""
from typing import Optional, List
from pydantic import BaseModel, Field, EmailStr
from datetime import datetime, date

from app.models.driver import DriverStatus, DocumentType


class DriverBase(BaseModel):
    """Base driver schema"""
    license_number: Optional[str] = None
    license_expiry: Optional[date] = None
    license_state: Optional[str] = None


class DriverCreate(DriverBase):
    """Driver registration schema"""
    user_id: int


class DriverUpdate(BaseModel):
    """Driver profile update"""
    # User info
    full_name: Optional[str] = Field(None, max_length=200)
    email: Optional[EmailStr] = None
    profile_picture: Optional[str] = Field(None, max_length=1000)

    # Driver profile info
    license_number: Optional[str] = Field(None, max_length=100)
    license_expiry: Optional[date] = None
    status: Optional[DriverStatus] = None
    is_online: Optional[bool] = None
    is_on_ride: Optional[bool] = None
    current_latitude: Optional[float] = Field(None, ge=-90, le=90)
    current_longitude: Optional[float] = Field(None, ge=-180, le=180)
    location_updated_at: Optional[datetime] = None


class DriverLocationUpdate(BaseModel):
    """Driver location update"""
    latitude: float = Field(..., ge=-90, le=90)
    longitude: float = Field(..., ge=-180, le=180)
    heading: Optional[float] = Field(None, ge=0, le=360, description="Direction in degrees")
    
    class Config:
        json_schema_extra = {
            "example": {
                "latitude": 37.7749,
                "longitude": -122.4194,
                "heading": 45.0
            }
        }


class DriverStatusUpdate(BaseModel):
    """Driver online/offline status update"""
    is_online: bool


class DriverDocumentCreate(BaseModel):
    """Driver document upload"""
    document_type: DocumentType
    document_url: str
    document_number: Optional[str] = None
    expiry_date: Optional[date] = None


class DriverDocumentResponse(BaseModel):
    """Driver document response"""
    id: int
    document_type: DocumentType
    document_url: str
    document_number: Optional[str] = None
    expiry_date: Optional[date] = None
    is_verified: bool
    verified_at: Optional[datetime] = None
    rejection_reason: Optional[str] = None
    created_at: datetime
    
    class Config:
        from_attributes = True


class DriverDocumentsUploadResponse(BaseModel):
    """Response for multipart driver document upload"""
    message: str
    documents: List[DriverDocumentResponse]


class DriverVerificationRequest(BaseModel):
    """Admin verification action"""
    status: DriverStatus = Field(..., description="New status")
    rejection_reason: Optional[str] = Field(None, description="Reason if rejecting")


class VehicleCreate(BaseModel):
    """Vehicle creation schema"""
    category_id: int
    make: str = Field(..., max_length=100)
    model: str = Field(..., max_length=100)
    year: int = Field(..., ge=1990, le=2030)
    color: str = Field(..., max_length=50)
    license_plate: str = Field(..., max_length=20)
    registration_number: Optional[str] = None
    registration_expiry: Optional[date] = None
    insurance_number: Optional[str] = None
    insurance_expiry: Optional[date] = None


class VehicleResponse(BaseModel):
    """Vehicle response schema"""
    id: int
    category_id: int
    category_name: Optional[str] = None
    make: str
    model: str
    year: int
    color: str
    license_plate: str
    is_active: bool
    is_verified: bool
    display_name: str
    created_at: datetime
    
    class Config:
        from_attributes = True


class DriverResponse(BaseModel):
    """Driver profile response"""
    id: int
    user_id: int
    
    # User info
    full_name: str
    email: Optional[str] = None
    phone: Optional[str] = None
    profile_picture: Optional[str] = None
    
    # Driver info
    license_number: Optional[str] = None
    license_expiry: Optional[date] = None
    status: DriverStatus
    is_online: bool
    is_on_ride: bool
    
    # Location
    current_latitude: Optional[float] = None
    current_longitude: Optional[float] = None
    location_updated_at: Optional[datetime] = None
    
    # Stats
    average_rating: float
    total_ratings: int
    total_rides: int
    completed_rides: int
    
    # Earnings
    total_earnings: int
    current_balance: int
    
    # Vehicle
    current_vehicle: Optional[VehicleResponse] = None
    
    # Documents
    documents: Optional[List[DriverDocumentResponse]] = None
    
    created_at: datetime
    
    class Config:
        from_attributes = True


class DriverEarningsResponse(BaseModel):
    """Driver earnings summary"""
    total_earnings: int  # All time
    current_balance: int  # Available for withdrawal
    pending_withdrawals: int
    today_earnings: int
    this_week_earnings: int
    this_month_earnings: int
    completed_rides_today: int
    completed_rides_this_week: int
    completed_rides_this_month: int


class NearbyDriverResponse(BaseModel):
    """Nearby driver for ride matching"""
    driver_id: int
    user_id: int
    full_name: str
    profile_picture: Optional[str] = None
    latitude: float
    longitude: float
    heading: Optional[float] = None
    distance_km: float
    average_rating: float
    total_rides: int
    vehicle: Optional[VehicleResponse] = None
    
    class Config:
        from_attributes = True
