"""Data models for SEO metrics, index status, and reports."""

from __future__ import annotations

from dataclasses import dataclass, field
from datetime import date


@dataclass
class SearchMetrics:
    clicks: int = 0
    impressions: int = 0
    ctr: float = 0.0
    position: float = 0.0


@dataclass
class QueryMetrics:
    query: str = ""
    clicks: int = 0
    impressions: int = 0
    ctr: float = 0.0
    position: float = 0.0


@dataclass
class PageMetrics:
    page: str = ""
    clicks: int = 0
    impressions: int = 0
    ctr: float = 0.0
    position: float = 0.0


@dataclass
class IndexStatus:
    url: str = ""
    verdict: str = ""
    coverage_state: str = ""
    indexing_state: str = ""
    page_fetch_state: str = ""
    robots_txt_state: str = ""
    last_crawl_time: str = ""
    is_indexed: bool = False


@dataclass
class SitemapStatus:
    path: str = ""
    last_submitted: str = ""
    last_downloaded: str = ""
    is_pending: bool = False
    is_sitemaps_index: bool = False
    warnings: int = 0
    errors: int = 0
    contents: list[dict] = field(default_factory=list)


@dataclass
class KeywordPosition:
    keyword: str = ""
    current_position: float = 0.0
    previous_position: float = 0.0
    change: float = 0.0
    clicks: int = 0
    impressions: int = 0
    is_alert: bool = False


@dataclass
class TrendComparison:
    period_label: str = ""
    current: SearchMetrics = field(default_factory=SearchMetrics)
    previous: SearchMetrics = field(default_factory=SearchMetrics)
    clicks_change_pct: float = 0.0
    impressions_change_pct: float = 0.0
    ctr_change_pct: float = 0.0
    position_change: float = 0.0


@dataclass
class KPIAlert:
    metric_name: str = ""
    current_value: float = 0.0
    threshold_value: float = 0.0
    message: str = ""


@dataclass
class SiteReport:
    site_name: str = ""
    property_url: str = ""
    report_date: date = field(default_factory=date.today)
    total_metrics: SearchMetrics = field(default_factory=SearchMetrics)
    top_queries: list[QueryMetrics] = field(default_factory=list)
    top_pages: list[PageMetrics] = field(default_factory=list)
    trends: list[TrendComparison] = field(default_factory=list)
    keyword_positions: list[KeywordPosition] = field(default_factory=list)
    kpi_alerts: list[KPIAlert] = field(default_factory=list)
    sitemap_statuses: list[SitemapStatus] = field(default_factory=list)
    unindexed_pages: list[IndexStatus] = field(default_factory=list)
    index_checked_count: int = 0
    index_ok_count: int = 0
    errors: list[str] = field(default_factory=list)


@dataclass
class DailyReport:
    report_date: date = field(default_factory=date.today)
    site_reports: list[SiteReport] = field(default_factory=list)
    has_alerts: bool = False
    execution_time_seconds: float = 0.0
