import uuid
from datetime import datetime
from typing import Literal

from pydantic import BaseModel, ConfigDict, model_validator

ScheduledJobType = Literal["run_task", "sla_overdue_scan"]
ScheduledJobFrequency = Literal["hourly", "daily", "weekly"]
ScheduledJobStatus = Literal["active", "paused"]


class ScheduledJobCreate(BaseModel):
    name: str
    job_type: ScheduledJobType
    task_id: uuid.UUID | None = None
    context: dict = {}
    frequency: ScheduledJobFrequency = "daily"

    @model_validator(mode="after")
    def _check_task_id(self) -> "ScheduledJobCreate":
        if self.job_type == "run_task" and not self.task_id:
            raise ValueError("run_task jobs require task_id")
        if self.job_type == "sla_overdue_scan" and self.task_id:
            raise ValueError("sla_overdue_scan jobs don't take a task_id — they scan every in_progress instance")
        return self


class ScheduledJobUpdate(BaseModel):
    name: str | None = None
    task_id: uuid.UUID | None = None
    context: dict | None = None
    frequency: ScheduledJobFrequency | None = None
    status: ScheduledJobStatus | None = None


class ScheduledJobRead(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: uuid.UUID
    tenant_id: uuid.UUID
    name: str
    job_type: ScheduledJobType
    task_id: uuid.UUID | None
    context: dict
    frequency: ScheduledJobFrequency
    status: ScheduledJobStatus
    last_run_at: datetime | None
    last_run_result: str | None
    next_run_at: datetime
    created_by: uuid.UUID | None
    created_at: datetime
    updated_at: datetime
