# app/analytics/schemas.py
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any, Union
from datetime import date, datetime



# Twitter Analytics Schema Models
class TwitterAccountMetrics(BaseModel):
    account_id: int
    account_name: str
    username: str
    profile_image: Optional[str] = None
    start_date: str
    end_date: str
    followers: int
    total_impressions: int
    total_new_followers: int
    total_profile_visits: int
    avg_impressions: float
    avg_engagement_rate: float
    metrics_by_date: List[Dict[str, Any]]

class TwitterAccountMetricsResponse(BaseModel):
    success: bool
    message: str
    data: Optional[TwitterAccountMetrics] = None

class TwitterPostMetrics(BaseModel):
    post_id: int
    external_post_id: str
    permalink: str
    content: str
    posted_at: str
    impressions: int
    likes: int
    comments: int
    shares: int
    engagement_rate: float
    has_media: bool

class TwitterPostMetricsResponse(BaseModel):
    success: bool
    message: str
    data: List[TwitterPostMetrics]



class TwitterAnalyticsReport(BaseModel):
    account_metrics: TwitterAccountMetrics
    top_posts: List[TwitterPostMetrics]
    audience_data: Dict[str, Any]
    growth_metrics: Dict[str, Any]
    recommendations: List[str]

class TwitterAnalyticsReportResponse(BaseModel):
    success: bool
    message: str
    data: Optional[TwitterAnalyticsReport] = None

# Request models
class DateRangeRequest(BaseModel):
    start_date: date = Field(..., description="Start date for metrics (YYYY-MM-DD)")
    end_date: Optional[date] = Field(None, description="End date for metrics (YYYY-MM-DD), defaults to today")



class MetricsReportRequest(BaseModel):
    account_ids: List[int]
    start_date: date
    end_date: Optional[date] = None

# UI Analytics Schemas
class SocialNetworkMetrics(BaseModel):
    network: str  # "Twitter", "Facebook Page", etc.
    posts: int
    reactions: int
    comments: int
    shares: int
    impressions: int
    engagement_rate: float

class DailyMetricsData(BaseModel):
    date: str
    twitter: Dict[str, int]  # {"posts": 5, "reactions": 10, "comments": 2, "shares": 1}
    facebook_page: Dict[str, int]

class OverallMetricsGauge(BaseModel):
    total_posts: int
    total_reactions: int
    total_comments: int
    total_shares: int
    percentage_change: float = 0.0

class TopTweetData(BaseModel):
    content: str
    posted_at: str
    impressions: int
    reactions: int
    comments: int
    shares: int
    engagement_rate: float
    permalink: str

class EngagementMetricsPanel(BaseModel):
    post_impressions: int
    post_retweets: int
    post_engagements: int
    post_engagement_rate: float
    media_engagements: List[Dict[str, Any]]  # Time series data for media engagements

class SocialMediaAnalyticsDashboard(BaseModel):
    overall_metrics: OverallMetricsGauge
    daily_metrics: List[DailyMetricsData]
    top_tweets: List[TopTweetData]
    engagement_metrics: EngagementMetricsPanel
    social_networks: List[SocialNetworkMetrics]

class SocialMediaAnalyticsResponse(BaseModel):
    success: bool
    message: str
    data: Optional[SocialMediaAnalyticsDashboard] = None

# Account-specific analytics schemas
class AccountInfo(BaseModel):
    id: int
    username: str
    platform: str

class TopTweetDataAccount(BaseModel):
    content: str
    posted_at: Optional[str]
    impressions: int
    reactions: int
    comments: int
    shares: int
    engagement_rate: float
    permalink: Optional[str]

class EngagementMetricsAccount(BaseModel):
    post_impressions: int
    post_retweets: int
    post_engagements: int
    post_engagement_rate: float
    media_engagements: List[Dict[str, Any]]

class TotalMetricsAccount(BaseModel):
    total_posts: int
    total_likes: int
    total_comments: int
    total_shares: int

class AccountSpecificAnalytics(BaseModel):
    account_info: AccountInfo
    top_tweets: List[TopTweetDataAccount]
    engagement_metrics: EngagementMetricsAccount
    total_metrics: TotalMetricsAccount
    overall_engagement_rates: List[float]

class AccountSpecificAnalyticsResponse(BaseModel):
    success: bool
    data: Optional[AccountSpecificAnalytics] = None