"""Pydantic schemas for PublishVersion."""

from datetime import datetime
from typing import Any, Optional

from pydantic import BaseModel, Field


PUBLISH_VERSION_STATUSES = [
    "draft",
    "pending_review",
    "approved",
    "published",
    "archived",
    "rolled_back",
]
PV_STATUS_PATTERN = "^(" + "|".join(PUBLISH_VERSION_STATUSES) + ")$"


class PublishVersionCreate(BaseModel):
    version_number: int = Field(..., ge=1)
    snapshot_data: Optional[dict[str, Any]] = None
    parent_version_id: Optional[str] = None
    changelog: Optional[str] = None


class PublishVersionSubmitReview(BaseModel):
    changelog: Optional[str] = None


class PublishVersionReview(BaseModel):
    status: str = Field(
        ..., pattern="^(approved|rejected)$"  # reviewers can approve or reject
    )
    review_notes: Optional[str] = None


class PublishVersionPublish(BaseModel):
    pass


class PublishVersionRead(BaseModel):
    id: str
    house_id: str
    version_number: int
    status: str
    snapshot_data: Optional[Any]
    parent_version_id: Optional[str]
    rolled_back_from_id: Optional[str]
    created_at: datetime
    updated_at: datetime
    submitted_at: Optional[datetime]
    reviewed_at: Optional[datetime]
    published_at: Optional[datetime]
    created_by: Optional[str]
    reviewed_by: Optional[str]
    published_by: Optional[str]
    changelog: Optional[str]
    review_notes: Optional[str]

    model_config = {"from_attributes": True}
