from datetime import datetime, timezone
from enum import Enum
from typing import Any
from uuid import UUID, uuid4

from pydantic import BaseModel, Field


def utc_now() -> datetime:
    return datetime.now(timezone.utc)


class JobStatus(str, Enum):
    ACCEPTED = "accepted"
    PROCESSING = "processing"
    SUCCEEDED = "succeeded"
    FAILED = "failed"


class ResponseMeta(BaseModel):
    """Common metadata returned by Gateway responses."""

    request_id: UUID = Field(default_factory=uuid4)
    status: JobStatus = JobStatus.SUCCEEDED
    stub: bool = False
    message: str = "OK"
    created_at: datetime = Field(default_factory=utc_now)


# Backward-compatible alias used by existing schemas
StubMeta = ResponseMeta


class ErrorDetail(BaseModel):
    code: str
    message: str
    details: dict[str, Any] = Field(default_factory=dict)


class ErrorResponse(BaseModel):
    error: ErrorDetail


def meta(*, stub: bool, message: str, status: JobStatus = JobStatus.SUCCEEDED) -> dict[str, Any]:
    return {
        "status": status,
        "stub": stub,
        "message": message,
    }
