"""
Jármű értékelési sémák a Social 1 modulhoz.
"""
from pydantic import BaseModel, Field, validator
from typing import Optional
from uuid import UUID
from datetime import datetime


class VehicleRatingCreate(BaseModel):
    """Értékelés beküldéséhez használt séma."""
    driving_experience: int = Field(..., ge=1, le=10, description="Vezetési élmény 1-10 skálán")
    reliability: int = Field(..., ge=1, le=10, description="Megbízhatóság 1-10 skálán")
    comfort: int = Field(..., ge=1, le=10, description="Kényelem 1-10 skálán")
    consumption_satisfaction: int = Field(..., ge=1, le=10, description="Fogyasztás elégedettség 1-10 skálán")
    comment: Optional[str] = Field(None, max_length=1000, description="Opcionális megjegyzés")

    @validator('driving_experience', 'reliability', 'comfort', 'consumption_satisfaction')
    def validate_rating_range(cls, v):
        if not 1 <= v <= 10:
            raise ValueError('Értékelésnek 1 és 10 között kell lennie')
        return v


class VehicleRatingResponse(BaseModel):
    """Értékelés válasza, tartalmazza a számított átlagpontszámot."""
    id: UUID
    vehicle_id: int
    user_id: int
    driving_experience: int
    reliability: int
    comfort: int
    consumption_satisfaction: int
    comment: Optional[str]
    average_score: float = Field(..., description="Számított átlagpontszám (4 dimenzió átlaga)")
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True

    @validator('average_score', pre=True, always=True)
    def calculate_average(cls, v, values):
        """Számolja ki az átlagpontszámot, ha nincs megadva."""
        if v is not None:
            return v
        # Ha nincs megadva, számoljuk ki a 4 dimenzióból
        scores = [
            values.get('driving_experience'),
            values.get('reliability'),
            values.get('comfort'),
            values.get('consumption_satisfaction')
        ]
        if any(score is None for score in scores):
            raise ValueError('Nem lehet kiszámolni az átlagot hiányzó értékelések miatt')
        return sum(scores) / 4.0