from __future__ import annotations

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, ConfigDict, Field


class SchedulerLogResponse(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: int
    task_name: str
    display_name: str
    run_status: str
    triggered_by: str
    triggered_by_admin_id: Optional[int] = None
    parent_log_id: Optional[int] = None
    started_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None
    duration_ms: Optional[int] = None
    records_processed: Optional[int] = None
    log_output: Optional[str] = None
    error_message: Optional[str] = None
    traceback: Optional[str] = None
    threshold_exceeded: bool = False
    celery_task_id: Optional[str] = None
    merchant_ids: Optional[list] = None
    created_at: datetime


class SchedulerSummary(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    task_name: str
    display_name: str
    schedule_expression: str
    is_enabled: bool
    supports_merchant_filter: bool
    alert_threshold_ms: Optional[int] = None
    last_run: Optional[SchedulerLogResponse] = None
    last_success_at: Optional[datetime] = None
    last_failure_at: Optional[datetime] = None
    success_rate_30d: float = 0.0


class SchedulerDetail(SchedulerSummary):
    recent_logs: list[SchedulerLogResponse] = []
    log_retention_days: int = 90
    description: Optional[str] = None
    total_runs_30d: int = 0


class TriggerSchedulerRequest(BaseModel):
    merchant_ids: Optional[list[int]] = None


class UpdateSchedulerConfigRequest(BaseModel):
    is_enabled: Optional[bool] = None
    alert_threshold_ms: Optional[int] = Field(None, ge=100)  # at least 100ms
    log_retention_days: Optional[int] = Field(None, ge=1, le=3650)  # 1 day to 10 years


class HealthSummaryResponse(BaseModel):
    total: int
    healthy: int
    failing: int
    paused: int
    recent_failures: list[SchedulerLogResponse] = []


class SchedulerLogListResponse(BaseModel):
    items: list[SchedulerLogResponse]
    total: int
    page: int
    page_size: int
