from datetime import datetime
from typing import Optional

from pydantic import BaseModel, field_validator

VALID_CATEGORIES = {"Operations", "Heritage", "Community", "Council"}


class CreateNewsRequest(BaseModel):
    title: str
    slug: Optional[str] = None
    content: Optional[str] = None
    excerpt: Optional[str] = None
    category: Optional[str] = None
    publish_date: Optional[datetime] = None
    cover_image_s3_key: Optional[str] = None
    status: str = "draft"

    @field_validator("category")
    @classmethod
    def validate_category(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and v not in VALID_CATEGORIES:
            raise ValueError(f"Category must be one of {sorted(VALID_CATEGORIES)}")
        return v


class UpdateNewsRequest(BaseModel):
    title: Optional[str] = None
    slug: Optional[str] = None
    content: Optional[str] = None
    excerpt: Optional[str] = None
    category: Optional[str] = None
    publish_date: Optional[datetime] = None
    cover_image_s3_key: Optional[str] = None
    status: Optional[str] = None

    @field_validator("category")
    @classmethod
    def validate_category(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and v not in VALID_CATEGORIES:
            raise ValueError(f"Category must be one of {sorted(VALID_CATEGORIES)}")
        return v
