"""
Pydantic schemas for tweets.

This module defines request and response schemas for tweet-related operations.
"""

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field, ConfigDict


class TweetBase(BaseModel):
    """Base schema for tweet data."""
    tweet_id: str = Field(..., description="Unique identifier from the source platform")
    text: str = Field(..., min_length=1, max_length=1000, description="Tweet content")
    created_at: datetime = Field(..., description="Timestamp when the tweet was created")
    retweet_count: int = Field(default=0, ge=0, description="Number of retweets")
    like_count: int = Field(default=0, ge=0, description="Number of likes")
    match_id: Optional[int] = Field(None, description="Foreign key to matches table")
    source: str = Field(default="twitter", description="Source platform (twitter, reddit, rss)")


class TweetCreate(TweetBase):
    """Schema for creating a new tweet."""
    pass


class TweetResponse(TweetBase):
    """Schema for tweet response."""
    id: int = Field(..., description="Primary key")
    model_config = ConfigDict(from_attributes=True)


class TweetListResponse(BaseModel):
    """Schema for a list of tweets."""
    data: list[TweetResponse]
    count: int = Field(..., description="Total number of tweets")
    meta: dict = Field(default_factory=dict, description="Additional metadata")


class TweetStatsResponse(BaseModel):
    """Schema for tweet statistics."""
    total_tweets: int = Field(..., description="Total number of tweets")
    tweets_by_source: dict = Field(..., description="Breakdown by source platform")
    tweets_by_match: dict = Field(..., description="Breakdown by match")
    avg_retweet_count: float = Field(..., description="Average retweet count")
    avg_like_count: float = Field(..., description="Average like count")
