"""Pydantic models for mantara.schema.v1 — used with OpenAI Structured Outputs."""

from __future__ import annotations
from typing import Optional
from pydantic import BaseModel


class Column(BaseModel):
    name: str
    type: str
    constraints: Optional[str] = None
    comment: Optional[str] = None


class ForeignKey(BaseModel):
    column: str
    references: str
    on_delete: Optional[str] = None
    on_update: Optional[str] = None


class Table(BaseModel):
    table_name: str
    comment: str
    columns: list[Column]
    foreign_keys: Optional[list[ForeignKey]] = None


class Submenu(BaseModel):
    submenu_id: int
    submenu_name: str
    sequence_number: int
    description: str
    tables: Optional[list[Table]] = None


class Menu(BaseModel):
    menu_id: int
    menu_name: str
    sequence_number: int
    description: str
    submenus: list[Submenu]


class EnumType(BaseModel):
    type_name: str
    values: list[str]
    description: Optional[str] = None


class MantaraSchema(BaseModel):
    """Root schema object. The '$schema' field is omitted here (invalid Python
    identifier) and added back during serialization."""
    system_name: str
    schema_name: str
    description: str
    menus: list[Menu]
    enum_types: Optional[list[EnumType]] = None
    assumptions: Optional[list[str]] = None
    open_questions: Optional[list[str]] = None

    def to_json_dict(self) -> dict:
        """Export as dict with '$schema' marker, excluding None values."""
        d = self.model_dump(exclude_none=True)
        return {"$schema": "mantara.schema.v1", **d}
