from datetime import datetime
from typing import Literal

from pydantic import BaseModel, ConfigDict, Field

IngredientKind = Literal["item", "section_header"]


class IngredientIn(BaseModel):
    kind: IngredientKind = "item"
    quantity: str | None = None
    unit: str | None = None
    text: str


class IngredientOut(IngredientIn):
    model_config = ConfigDict(from_attributes=True)
    id: int


class StepIn(BaseModel):
    text: str


class StepOut(StepIn):
    model_config = ConfigDict(from_attributes=True)
    id: int


class RecipeIn(BaseModel):
    name: str = Field(min_length=1)
    category: str | None = None
    preptime: str | None = None
    cooktime: str | None = None
    baketime: str | None = None
    cooltime: str | None = None
    marinade_time: str | None = None
    robot_time: str | None = None
    servings: str | None = None
    notes: str | None = None
    kcal: str | None = None
    kh: str | None = None
    protein: str | None = None
    fett: str | None = None
    ingredients: list[IngredientIn] = Field(default_factory=list)
    steps: list[StepIn] = Field(default_factory=list)


class RecipeSummary(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    name: str
    slug: str
    category: str | None
    image_filename: str | None


class RecipeOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)
    id: int
    name: str
    slug: str
    category: str | None
    image_filename: str | None
    preptime: str | None
    cooktime: str | None
    baketime: str | None
    cooltime: str | None
    marinade_time: str | None
    robot_time: str | None
    servings: str | None
    notes: str | None
    kcal: str | None
    kh: str | None
    protein: str | None
    fett: str | None
    created_at: datetime
    updated_at: datetime
    ingredients: list[IngredientOut]
    steps: list[StepOut]
