# services/external/app/schemas/calendar.py
"""
Calendar Schemas - Request/Response types for school calendars and location context
"""

from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
from uuid import UUID


class SchoolCalendarResponse(BaseModel):
    """School calendar information"""
    calendar_id: str
    calendar_name: str
    city_id: str
    school_type: str
    academic_year: str
    holiday_periods: List[Dict[str, Any]]
    school_hours: Dict[str, Any]
    source: Optional[str] = None
    enabled: bool = True

    class Config:
        json_schema_extra = {
            "example": {
                "calendar_id": "madrid_primary_2024_2025",
                "calendar_name": "Madrid Primary School Calendar 2024-2025",
                "city_id": "madrid",
                "school_type": "primary",
                "academic_year": "2024-2025",
                "holiday_periods": [
                    {
                        "name": "Christmas Holiday",
                        "start_date": "2024-12-23",
                        "end_date": "2025-01-07",
                        "description": "Christmas and New Year break"
                    }
                ],
                "school_hours": {
                    "morning_start": "09:00",
                    "morning_end": "14:00",
                    "has_afternoon_session": False
                },
                "source": "madrid_education_dept_2024",
                "enabled": True
            }
        }


class SchoolCalendarListResponse(BaseModel):
    """List of school calendars for a city"""
    city_id: str
    calendars: List[SchoolCalendarResponse]
    total: int


class CalendarCheckResponse(BaseModel):
    """Response for holiday check"""
    date: str = Field(..., description="Date checked (ISO format)")
    is_holiday: bool = Field(..., description="Whether the date is a school holiday")
    holiday_name: Optional[str] = Field(None, description="Name of the holiday if applicable")
    calendar_id: str
    calendar_name: str


class TenantLocationContextResponse(BaseModel):
    """Tenant location context with calendar details"""
    tenant_id: str
    city_id: str
    neighborhood: Optional[str] = None
    local_events: Optional[List[Dict[str, Any]]] = None
    notes: Optional[str] = None
    calendar: Optional[Dict[str, Any]] = Field(
        None,
        description="Full calendar details if assigned"
    )

    class Config:
        json_schema_extra = {
            "example": {
                "tenant_id": "fbffcf18-d02a-4104-b6e3-0b32006e3e47",
                "city_id": "madrid",
                "neighborhood": "Chamberí",
                "local_events": [
                    {
                        "name": "Neighborhood Festival",
                        "date": "2025-06-15",
                        "impact": "high"
                    }
                ],
                "notes": "Bakery near primary school",
                "calendar": {
                    "calendar_id": "uuid",
                    "calendar_name": "Madrid Primary School Calendar 2024-2025",
                    "school_type": "primary",
                    "academic_year": "2024-2025",
                    "holiday_periods": [],
                    "school_hours": {},
                    "source": "madrid_education_dept_2024"
                }
            }
        }


class TenantLocationContextCreateRequest(BaseModel):
    """Request to create/update tenant location context"""
    city_id: str = Field(..., description="City ID (e.g., 'madrid')")
    school_calendar_id: Optional[UUID] = Field(
        None,
        description="School calendar ID to assign"
    )
    neighborhood: Optional[str] = Field(None, description="Neighborhood name")
    local_events: Optional[List[Dict[str, Any]]] = Field(
        None,
        description="Local events specific to this location"
    )
    notes: Optional[str] = Field(None, description="Additional notes")

    class Config:
        json_schema_extra = {
            "example": {
                "city_id": "madrid",
                "school_calendar_id": "123e4567-e89b-12d3-a456-426614174000",
                "neighborhood": "Chamberí",
                "local_events": [
                    {
                        "name": "Local Market Day",
                        "date": "2025-05-20",
                        "impact": "medium"
                    }
                ],
                "notes": "Bakery located near primary school entrance"
            }
        }
