"""
Pydantic schemas for user_predictions.

This module defines request and response schemas for user prediction tracking operations.
"""

from datetime import datetime
from typing import Optional, Any

from pydantic import BaseModel, Field, ConfigDict


class UserPredictionBase(BaseModel):
    """Base schema for user prediction data."""
    user_id: int = Field(..., description="Foreign key to users table")
    prediction_id: int = Field(..., description="Foreign key to predictions table")
    viewed_at: datetime = Field(..., description="Timestamp when user viewed prediction")
    was_correct: Optional[bool] = Field(None, description="True if prediction was correct, False if incorrect, NULL if match not completed")


class UserPredictionCreate(UserPredictionBase):
    """Schema for creating a new user prediction record."""
    pass


class UserPredictionUpdate(BaseModel):
    """Schema for updating a user prediction record."""
    was_correct: Optional[bool] = Field(None, description="Update whether prediction was correct")


class PredictionMatchInfo(BaseModel):
    """Schema for match information included in user prediction response."""
    id: int = Field(..., description="Match ID")
    home_team: str = Field(..., description="Home team name")
    away_team: str = Field(..., description="Away team name")
    date: datetime = Field(..., description="Match date and time")
    league: str = Field(..., description="League name")
    status: str = Field(..., description="Match status")
    actual_winner: Optional[str] = Field(None, description="Actual winner when match is completed")


class PredictionInfo(BaseModel):
    """Schema for prediction information included in user prediction response."""
    id: int = Field(..., description="Prediction ID")
    match_id: int = Field(..., description="Match ID")
    energy_score: str = Field(..., description="Energy score")
    confidence: str = Field(..., description="Confidence level")
    predicted_winner: str = Field(..., description="Predicted winner")
    created_at: datetime = Field(..., description="Prediction creation time")


class UserPredictionResponse(BaseModel):
    """Schema for user prediction response with full details."""
    id: int = Field(..., description="Primary key")
    user_id: int = Field(..., description="User ID")
    prediction_id: int = Field(..., description="Prediction ID")
    viewed_at: datetime = Field(..., description="When user viewed prediction")
    was_correct: Optional[bool] = Field(None, description="True if prediction was correct")
    prediction: PredictionInfo = Field(..., description="Full prediction details")
    model_config = ConfigDict(from_attributes=False)


class UserPredictionListResponse(BaseModel):
    """Schema for a list of user predictions with metadata."""
    data: list[UserPredictionResponse] = Field(..., description="List of user predictions")
    meta: dict = Field(..., description="Metadata including totals")


class UserStatsResponse(BaseModel):
    """Schema for user statistics."""
    total_predictions_viewed: int = Field(..., description="Total number of predictions viewed by user")
    correct_predictions: int = Field(..., description="Number of correct predictions")
    incorrect_predictions: int = Field(..., description="Number of incorrect predictions")
    accuracy_rate: float = Field(..., description="Accuracy rate as percentage (0-100)")
    roi: float = Field(..., description="Return on Investment in EUR")
