import uuid
from datetime import date, datetime

from pydantic import BaseModel, ConfigDict


class InterfaceChangeCreate(BaseModel):
    repo_slug: str
    interface_type: str  # rest_api | mcp_tool | cli | schema | capability
    change_type: str     # breaking | additive | deprecation | removal
    title: str
    description: str
    affected_paths: list[str] = []
    affected_repo_slugs: list[str] = []
    planned_for: date | None = None
    author: str = "custodian"


class InterfaceChangePatch(BaseModel):
    title: str | None = None
    description: str | None = None
    affected_paths: list[str] | None = None
    affected_repo_slugs: list[str] | None = None
    planned_for: date | None = None


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

    id: uuid.UUID
    repo_id: uuid.UUID
    repo_slug: str
    interface_type: str
    change_type: str
    title: str
    description: str
    affected_paths: list[str]
    affected_repo_slugs: list[str]
    status: str
    planned_for: date | None
    published_at: datetime | None
    resolved_at: datetime | None
    author: str
    created_at: datetime
    updated_at: datetime

    @classmethod
    def from_orm_with_slug(cls, obj) -> "InterfaceChangeRead":
        return cls(
            id=obj.id,
            repo_id=obj.repo_id,
            repo_slug=obj.repo.slug,
            interface_type=obj.interface_type,
            change_type=obj.change_type,
            title=obj.title,
            description=obj.description,
            affected_paths=obj.affected_paths or [],
            affected_repo_slugs=obj.affected_repo_slugs or [],
            status=obj.status,
            planned_for=obj.planned_for,
            published_at=obj.published_at,
            resolved_at=obj.resolved_at,
            author=obj.author,
            created_at=obj.created_at,
            updated_at=obj.updated_at,
        )
