from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from app.models import ( NotificationStatus, NotificationType, ProviderStatusType, RegionScope, SourceStatusType, WatchType, ) class WatchItemCreate(BaseModel): name: str = Field(min_length=2, max_length=255) watch_type: WatchType region_scope: RegionScope notes: str | None = None class WatchItemUpdate(BaseModel): name: str | None = Field(default=None, min_length=2, max_length=255) watch_type: WatchType | None = None region_scope: RegionScope | None = None notes: str | None = None is_active: bool | None = None class WatchItemRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int name: str watch_type: WatchType region_scope: RegionScope notes: str | None is_active: bool created_at: datetime updated_at: datetime class WatchSourceCreate(BaseModel): label: str | None = Field(default=None, max_length=255) url: str = Field(min_length=8, max_length=1024) parser_type: str = "auto" class WatchSourceUpdate(BaseModel): label: str | None = Field(default=None, max_length=255) url: str | None = Field(default=None, min_length=8, max_length=1024) parser_type: str | None = None is_active: bool | None = None class WatchSourceRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int watch_item_id: int label: str | None url: str parser_type: str is_active: bool last_status: SourceStatusType last_message: str | None last_checked_at: datetime | None created_at: datetime updated_at: datetime class PurchaseUpdate(BaseModel): is_ticket_purchased: bool class TrackedEventRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int watch_item_id: int source: str external_id: str title: str matched_term: str venue_name: str | None city: str | None country_code: str | None event_date: datetime | None ticket_url: str | None image_url: str | None is_ticket_purchased: bool purchased_at: datetime | None discovery_notified_at: datetime | None reminder_notified_at: datetime | None first_seen_at: datetime last_seen_at: datetime class NotificationLogRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int tracked_event_id: int notification_type: NotificationType status: NotificationStatus message: str created_at: datetime class SyncResult(BaseModel): scanned_watch_items: int new_events: int updated_events: int notifications_sent: int notifications_skipped: int class ProviderStatusRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int provider_name: str status: ProviderStatusType message: str last_checked_at: datetime last_success_at: datetime | None