"""Address schemas — create, update, read, list."""

from __future__ import annotations

from pydantic import BaseModel, Field


class AddressCreate(BaseModel):
    entity_type: str = Field(..., pattern="^contact$", description="'contact'")
    entity_id: str = Field(..., description="UUID of the parent entity")
    label: str = Field(..., min_length=1, max_length=100)
    address_type: str = Field(
        ...,
        pattern="^(billing|shipping|headquarters|branch|private|other)$",
    )
    street: str | None = Field(None, max_length=255)
    street_number: str | None = Field(None, max_length=20)
    city: str | None = Field(None, max_length=100)
    zip: str | None = Field(None, max_length=20)
    state: str | None = Field(None, max_length=100)
    country: str | None = Field(None, max_length=2)
    is_default: bool = False


class AddressUpdate(BaseModel):
    label: str | None = Field(None, min_length=1, max_length=100)
    address_type: str | None = Field(
        None,
        pattern="^(billing|shipping|headquarters|branch|private|other)$",
    )
    street: str | None = Field(None, max_length=255)
    street_number: str | None = Field(None, max_length=20)
    city: str | None = Field(None, max_length=100)
    zip: str | None = Field(None, max_length=20)
    state: str | None = Field(None, max_length=100)
    country: str | None = Field(None, max_length=2)
    is_default: bool | None = None


class AddressResponse(BaseModel):
    id: str
    entity_type: str
    entity_id: str
    label: str
    address_type: str
    street: str | None = None
    street_number: str | None = None
    city: str | None = None
    zip: str | None = None
    state: str | None = None
    country: str | None = None
    is_default: bool
    created_at: str | None = None
    updated_at: str | None = None


class AddressListResponse(BaseModel):
    items: list[AddressResponse]
    total: int
