from __future__ import annotations

import uuid
from datetime import datetime

from pydantic import BaseModel, Field


class RecentlyOnScopeGenerate(BaseModel):
    range: str = Field(default="1h", description="Time range such as 15m, 1h, 6h, or 1d")
    since: datetime | None = None
    until: datetime | None = None


class RecentlyOnScopeSourceCounts(BaseModel):
    progress_events: int = 0
    decisions: int = 0
    workstreams: int = 0
    tasks: int = 0
    repos: int = 0
    attention_items: int = 0


class RecentlyOnScopeReportMetadata(BaseModel):
    id: str
    domain_slug: str
    range: str
    since: datetime
    until: datetime
    generated_at: datetime
    path: str
    source_counts: RecentlyOnScopeSourceCounts


class RecentlyOnScopeGeneratedReport(RecentlyOnScopeReportMetadata):
    markdown: str


class RecentlyOnScopeHourlyGenerate(RecentlyOnScopeGenerate):
    active_only: bool = True
    include_attention: bool = False


class RecentlyOnScopeSkippedDomain(BaseModel):
    domain_slug: str
    reason: str
    source_counts: RecentlyOnScopeSourceCounts


class RecentlyOnScopeFailedDomain(BaseModel):
    domain_slug: str
    error: str


class RecentlyOnScopeHourlyRun(BaseModel):
    range: str
    since: datetime
    until: datetime
    generated_at: datetime
    active_only: bool
    include_attention: bool
    generated: list[RecentlyOnScopeReportMetadata] = Field(default_factory=list)
    skipped: list[RecentlyOnScopeSkippedDomain] = Field(default_factory=list)
    failed: list[RecentlyOnScopeFailedDomain] = Field(default_factory=list)
    progress_event_id: uuid.UUID | None = None
