# /opt/docker/dev/service_finder/backend/app/schemas/asset_event.py
from pydantic import BaseModel, ConfigDict, Field, validator
from typing import Optional, Dict, Any, List
from uuid import UUID
from datetime import datetime
from enum import Enum

class AssetEventTypeEnum(str, Enum):
    """Digitális Szervizkönyv eseménytípusok."""
    SERVICE = "SERVICE"  # Szerviz
    REPAIR = "REPAIR"  # Javítás
    ACCIDENT = "ACCIDENT"  # Baleset
    INSPECTION = "INSPECTION"  # Műszaki vizsga
    TIRE_CHANGE = "TIRE_CHANGE"  # Gumi csere
    MAINTENANCE = "MAINTENANCE"  # Karbantartás
    UPGRADE = "UPGRADE"  # Fejlesztés
    RECALL = "RECALL"  # Visszahívás
    OTHER = "OTHER"  # Egyéb

class AssetEventCreate(BaseModel):
    """Digitális Szervizkönyv esemény létrehozásához szükséges adatok."""
    event_type: AssetEventTypeEnum = Field(..., description="Esemény típusa")
    odometer_reading: Optional[int] = Field(None, ge=0, description="Km óra állás az eseménykor")
    description: str = Field(..., min_length=1, max_length=1000, description="Esemény leírása")
    event_date: Optional[datetime] = Field(None, description="Esemény dátuma (alapértelmezett: most)")
    cost_id: Optional[UUID] = Field(None, description="Kapcsolódó költség rekord ID (opcionális)")
    
    # RBAC ellenőrzés: csak a tulajdonos vagy operátor szervezet adhat hozzá eseményt
    # Ezt a service rétegben validáljuk, nem a sémában
    
    model_config = ConfigDict(from_attributes=True)

class AssetEventResponse(BaseModel):
    """Digitális Szervizkönyv esemény teljes válaszmodellje."""
    id: UUID
    asset_id: UUID
    user_id: Optional[int] = None
    organization_id: Optional[int] = None
    
    event_type: str
    odometer_reading: Optional[int] = None
    description: Optional[str] = None
    cost_id: Optional[UUID] = None
    
    event_date: datetime
    created_at: datetime
    updated_at: Optional[datetime] = None
    
    # Kapcsolódó entitások (opcionális, csak ha eager loadoltuk)
    user_name: Optional[str] = Field(None, description="Felhasználó neve")
    organization_name: Optional[str] = Field(None, description="Szervezet neve")
    
    model_config = ConfigDict(from_attributes=True)

class AssetEventUpdate(BaseModel):
    """Digitális Szervizkönyv esemény frissítéséhez szükséges adatok."""
    event_type: Optional[AssetEventTypeEnum] = Field(None, description="Esemény típusa")
    odometer_reading: Optional[int] = Field(None, ge=0, description="Km óra állás az eseménykor")
    description: Optional[str] = Field(None, min_length=1, max_length=1000, description="Esemény leírása")
    event_date: Optional[datetime] = Field(None, description="Esemény dátuma")
    cost_id: Optional[UUID] = Field(None, description="Kapcsolódó költség rekord ID")
    
    @validator('description')
    def validate_description(cls, v):
        if v is not None and len(v.strip()) == 0:
            raise ValueError('Description cannot be empty or whitespace only')
        return v
    
    model_config = ConfigDict(from_attributes=True)

class AssetEventListResponse(BaseModel):
    """Digitális Szervizkönyv események listázásának válasza."""
    items: List[AssetEventResponse] = Field(default_factory=list)
    total: int = Field(0, description="Összes esemény száma")
    page: int = Field(1, description="Aktuális oldal")
    page_size: int = Field(20, description="Oldalméret")
    
    model_config = ConfigDict(from_attributes=True)