# generated by datamodel-codegen:
#   filename:  flat-rate-option.json
#   timestamp: 2025-11-15T22:03:55+00:00

from __future__ import annotations

from typing import Annotated, Literal

from adcp.types.base import AdCPBaseModel
from pydantic import ConfigDict, Field


class Parameters(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    daypart: Annotated[
        str | None,
        Field(
            description="Specific daypart for time-based pricing (e.g., 'morning_commute', 'evening_prime', 'overnight')"
        ),
    ] = None
    duration_hours: Annotated[
        float | None,
        Field(description="Duration in hours for time-based flat rate pricing (DOOH)", ge=0.0),
    ] = None
    estimated_impressions: Annotated[
        int | None,
        Field(
            description="Estimated impressions for this flat rate option (informational, commonly used with SOV or time-based DOOH)",
            ge=0,
        ),
    ] = None
    loop_duration_seconds: Annotated[
        int | None, Field(description="Duration of ad loop rotation in seconds (DOOH)", ge=1)
    ] = None
    min_plays_per_hour: Annotated[
        int | None,
        Field(
            description="Minimum number of times ad plays per hour (DOOH frequency guarantee)", ge=0
        ),
    ] = None
    sov_percentage: Annotated[
        float | None,
        Field(
            description="Guaranteed share of voice as percentage (DOOH, 0-100)", ge=0.0, le=100.0
        ),
    ] = None
    venue_package: Annotated[
        str | None,
        Field(
            description="Named venue package identifier for DOOH (e.g., 'times_square_network', 'airport_terminals')"
        ),
    ] = None


class FlatRatePricingOption(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    currency: Annotated[
        str,
        Field(
            description="ISO 4217 currency code",
            examples=["USD", "EUR", "GBP", "JPY"],
            pattern="^[A-Z]{3}$",
        ),
    ]
    is_fixed: Annotated[
        Literal[True],
        Field(description="Whether this is a fixed rate (true) or auction-based (false)"),
    ]
    min_spend_per_package: Annotated[
        float | None,
        Field(
            description="Minimum spend requirement per package using this pricing option, in the specified currency",
            ge=0.0,
        ),
    ] = None
    parameters: Annotated[
        Parameters | None,
        Field(description="Flat rate parameters for DOOH and time-based campaigns"),
    ] = None
    pricing_model: Annotated[
        Literal["flat_rate"], Field(description="Fixed cost regardless of delivery volume")
    ]
    pricing_option_id: Annotated[
        str,
        Field(
            description="Unique identifier for this pricing option within the product (e.g., 'flat_rate_usd_24h_takeover')"
        ),
    ]
    rate: Annotated[float, Field(description="Flat rate cost", ge=0.0)]
