# generated by datamodel-codegen:
#   filename:  create-media-buy-request.json
#   timestamp: 2025-11-15T22:03:55+00:00

from __future__ import annotations

from enum import Enum
from typing import Annotated, Any

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

from . import brand_manifest_ref as brand_manifest_1
from . import package_request
from .push_notification_config import PushNotificationConfig


class ReportingFrequency(Enum):
    hourly = "hourly"
    daily = "daily"
    monthly = "monthly"


class RequestedMetric(Enum):
    impressions = "impressions"
    spend = "spend"
    clicks = "clicks"
    ctr = "ctr"
    video_completions = "video_completions"
    completion_rate = "completion_rate"
    conversions = "conversions"
    viewability = "viewability"
    engagement_rate = "engagement_rate"


class ReportingWebhook(PushNotificationConfig):
    reporting_frequency: Annotated[
        ReportingFrequency,
        Field(
            description="Frequency for automated reporting delivery. Must be supported by all products in the media buy."
        ),
    ]
    requested_metrics: Annotated[
        list[RequestedMetric] | None,
        Field(
            description="Optional list of metrics to include in webhook notifications. If omitted, all available metrics are included. Must be subset of product's available_metrics."
        ),
    ] = None


class CreateMediaBuyRequest(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    brand_manifest: Annotated[
        brand_manifest_1.BrandManifest | AnyUrl,
        Field(
            description="Brand information manifest serving as the namespace and identity for this media buy. Provides brand context, assets, and product catalog. Can be provided inline or as a URL reference to a hosted manifest. Can be cached and reused across multiple requests.",
            examples=[
                {
                    "data": {
                        "colors": {"primary": "#FF6B35"},
                        "name": "ACME Corporation",
                        "url": "https://acmecorp.com",
                    },
                    "description": "Inline brand manifest",
                },
                {
                    "data": "https://cdn.acmecorp.com/brand-manifest.json",
                    "description": "URL string reference to hosted manifest",
                },
            ],
            title="Brand Manifest Reference",
        ),
    ]
    buyer_ref: Annotated[str, Field(description="Buyer's reference identifier for this media buy")]
    context: Annotated[
        dict[str, Any] | None,
        Field(
            description="Initiator-provided context included in the request payload. Agentsmust echo this value back unchanged in responses and webhooks. Use for UI/session hints, correlation tokens, or tracking metadata."
        ),
    ] = None
    end_time: Annotated[
        AwareDatetime, Field(description="Campaign end date/time in ISO 8601 format")
    ]
    packages: Annotated[
        list[package_request.PackageRequest], Field(description="Array of package configurations")
    ]
    po_number: Annotated[str | None, Field(description="Purchase order number for tracking")] = None
    reporting_webhook: ReportingWebhook | None = None
    start_time: Annotated[
        str | AwareDatetime,
        Field(
            description="Campaign start timing: 'asap' or ISO 8601 date-time", title="Start Timing"
        ),
    ]
