"""
System Configuration Schemas
System settings and map provider configuration
"""
from typing import Optional, Any, List, Dict
from pydantic import BaseModel, Field
from datetime import datetime

from app.models.system_config import MapProviderType, ConfigCategory


class SystemConfigResponse(BaseModel):
    """System configuration response"""
    id: int
    key: str
    value: str
    value_type: str
    category: ConfigCategory
    label: str
    description: Optional[str] = None
    is_required: bool
    is_editable: bool
    is_visible: bool
    
    class Config:
        from_attributes = True


class SystemConfigUpdate(BaseModel):
    """Update system configuration"""
    value: str


class SystemConfigBulkUpdate(BaseModel):
    """Bulk update system configurations"""
    configs: Dict[str, str]  # {key: value}


class MapProviderConfigResponse(BaseModel):
    """Map provider configuration response"""
    id: int
    provider_name: MapProviderType
    display_name: str
    description: Optional[str] = None
    api_url: Optional[str] = None
    is_active: bool
    is_configured: bool
    priority: int
    last_tested_at: Optional[datetime] = None
    last_test_status: Optional[str] = None
    settings: Optional[Dict[str, Any]] = None
    
    # Note: api_key and api_secret are NOT included for security
    
    class Config:
        from_attributes = True


class MapProviderConfigUpdate(BaseModel):
    """Update map provider configuration"""
    api_key: Optional[str] = None
    api_secret: Optional[str] = None
    api_url: Optional[str] = None
    is_active: Optional[bool] = None
    priority: Optional[int] = None
    settings: Optional[Dict[str, Any]] = None


class MapProviderActivate(BaseModel):
    """Activate a map provider"""
    provider_name: MapProviderType


class MapProviderTestRequest(BaseModel):
    """Test map provider configuration"""
    provider_name: MapProviderType
    test_address: str = Field(default="New York, NY", description="Address to test geocoding")


class MapProviderTestResponse(BaseModel):
    """Map provider test result"""
    provider_name: MapProviderType
    success: bool
    response_time_ms: int
    error_message: Optional[str] = None
    test_result: Optional[Dict[str, Any]] = None


class FareConfigResponse(BaseModel):
    """Fare configuration response"""
    base_fare: int
    per_km_rate: int
    per_minute_rate: int
    minimum_fare: int
    booking_fee: int
    commission_percentage: float
    surge_multiplier: float
    night_multiplier: float


class FareConfigUpdate(BaseModel):
    """Update fare configuration"""
    base_fare: Optional[int] = Field(None, gt=0)
    per_km_rate: Optional[int] = Field(None, gt=0)
    per_minute_rate: Optional[int] = Field(None, ge=0)
    minimum_fare: Optional[int] = Field(None, gt=0)
    booking_fee: Optional[int] = Field(None, ge=0)
    commission_percentage: Optional[float] = Field(None, ge=0, le=100)
    surge_multiplier: Optional[float] = Field(None, ge=1.0, le=5.0)
    night_multiplier: Optional[float] = Field(None, ge=1.0, le=3.0)


class AdminDashboardResponse(BaseModel):
    """Admin dashboard data"""
    # Users
    total_users: int
    total_passengers: int
    total_drivers: int
    active_drivers: int
    pending_driver_verifications: int
    
    # Rides
    total_rides: int
    completed_rides: int
    active_rides: int
    cancelled_rides: int
    
    # Revenue
    total_revenue: int
    total_commission: int
    today_revenue: int
    this_week_revenue: int
    this_month_revenue: int
    
    # Trends
    new_users_today: int
    new_users_this_week: int
    rides_today: int
    rides_this_week: int


class PromoCodeCreate(BaseModel):
    """Create promo code"""
    code: str = Field(..., min_length=3, max_length=50)
    title: str
    description: Optional[str] = None
    promo_type: str = Field(default="percentage", pattern="^(percentage|fixed|free_ride)$")
    discount_value: float = Field(..., gt=0)
    min_order_value: int = Field(default=0, ge=0)
    max_discount: Optional[int] = Field(None, gt=0)
    total_usage_limit: Optional[int] = Field(None, gt=0)
    per_user_limit: int = Field(default=1, ge=1)
    valid_from: datetime
    valid_until: datetime
    for_new_users_only: bool = False
    applicable_vehicle_categories: Optional[List[int]] = None
    is_active: bool = True


class PromoCodeResponse(BaseModel):
    """Promo code response"""
    id: int
    code: str
    title: str
    description: Optional[str] = None
    promo_type: str
    discount_value: float
    min_order_value: int
    max_discount: Optional[int] = None
    total_usage_limit: Optional[int] = None
    per_user_limit: int
    current_usage_count: int
    valid_from: datetime
    valid_until: datetime
    for_new_users_only: bool
    is_active: bool
    is_valid: bool
    created_at: datetime
    
    class Config:
        from_attributes = True
