from typing import Annotated

from ninja import ModelSchema, Schema
from pydantic import Field, NonNegativeInt, PositiveInt, TypeAdapter
from pydantic_extra_types.phone_numbers import PhoneNumber, PhoneNumberValidator

from counter.models import BillingInfo


class PurchaseItemSchema(Schema):
    product_id: NonNegativeInt = Field(alias="id")
    name: str
    unit_price: float
    quantity: PositiveInt


# The eboutic deals with data that is dict mixed with JSON.
# Hence it would be a hassle to manage it with a proper Schema class,
# and we use a TypeAdapter instead
PurchaseItemList = TypeAdapter(list[PurchaseItemSchema])


class BillingInfoSchema(ModelSchema):
    class Meta:
        model = BillingInfo
        fields = [
            "customer",
            "first_name",
            "last_name",
            "address_1",
            "address_2",
            "zip_code",
            "city",
            "country",
        ]
        fields_optional = ["customer"]

    # for reasons described in the model, BillingInfo.phone_number
    # in nullable, but null values shouldn't be actually allowed,
    # so we force the field to be required
    phone_number: Annotated[PhoneNumber, PhoneNumberValidator(default_region="FR")]