# generated by datamodel-codegen:
#   filename:  adagents.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 AnyUrl, AwareDatetime, ConfigDict, EmailStr, Field, RootModel

from . import property


class PropertyId(RootModel[str]):
    root: Annotated[str, Field(pattern="^[a-z0-9_]+$")]


class AuthorizedAgents(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    authorization_type: Annotated[
        Literal["property_ids"],
        Field(description="Discriminator indicating authorization by specific property IDs"),
    ]
    authorized_for: Annotated[
        str,
        Field(
            description="Human-readable description of what this agent is authorized to sell",
            max_length=500,
            min_length=1,
        ),
    ]
    property_ids: Annotated[
        list[PropertyId],
        Field(
            description="Property IDs this agent is authorized for. Resolved against the top-level properties array in this file",
            min_length=1,
        ),
    ]
    url: Annotated[AnyUrl, Field(description="The authorized agent's API endpoint URL")]


class PropertyTag(PropertyId):
    pass


class AuthorizedAgents1(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    authorization_type: Annotated[
        Literal["property_tags"],
        Field(description="Discriminator indicating authorization by property tags"),
    ]
    authorized_for: Annotated[
        str,
        Field(
            description="Human-readable description of what this agent is authorized to sell",
            max_length=500,
            min_length=1,
        ),
    ]
    property_tags: Annotated[
        list[PropertyTag],
        Field(
            description="Tags identifying which properties this agent is authorized for. Resolved against the top-level properties array in this file using tag matching",
            min_length=1,
        ),
    ]
    url: Annotated[AnyUrl, Field(description="The authorized agent's API endpoint URL")]


class PublisherProperties(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    property_ids: Annotated[
        list[PropertyId],
        Field(
            description="Specific property IDs from the publisher's adagents.json properties array",
            min_length=1,
        ),
    ]
    publisher_domain: Annotated[
        str,
        Field(
            description="Domain where the publisher's adagents.json is hosted (e.g., 'cnn.com')",
            pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
        ),
    ]
    selection_type: Annotated[
        Literal["by_id"],
        Field(description="Discriminator indicating selection by specific property IDs"),
    ]


class PublisherProperties1(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    property_tags: Annotated[
        list[PropertyTag],
        Field(
            description="Property tags from the publisher's adagents.json tags. Agent is authorized for all properties with these tags",
            min_length=1,
        ),
    ]
    publisher_domain: Annotated[
        str,
        Field(
            description="Domain where the publisher's adagents.json is hosted (e.g., 'cnn.com')",
            pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
        ),
    ]
    selection_type: Annotated[
        Literal["by_tag"], Field(description="Discriminator indicating selection by property tags")
    ]


class AuthorizedAgents3(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    authorization_type: Annotated[
        Literal["publisher_properties"],
        Field(
            description="Discriminator indicating authorization for properties from other publisher domains"
        ),
    ]
    authorized_for: Annotated[
        str,
        Field(
            description="Human-readable description of what this agent is authorized to sell",
            max_length=500,
            min_length=1,
        ),
    ]
    publisher_properties: Annotated[
        list[PublisherProperties | PublisherProperties1],
        Field(
            description="Properties from other publisher domains this agent is authorized for. Each entry specifies a publisher domain and which of their properties this agent can sell",
            min_length=1,
        ),
    ]
    url: Annotated[AnyUrl, Field(description="The authorized agent's API endpoint URL")]


class Contact(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    domain: Annotated[
        str | None,
        Field(
            description="Primary domain of the entity managing this file",
            pattern="^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$",
        ),
    ] = None
    email: Annotated[
        EmailStr | None,
        Field(
            description="Contact email for questions or issues with this authorization file",
            max_length=255,
            min_length=1,
        ),
    ] = None
    name: Annotated[
        str,
        Field(
            description="Name of the entity managing this file (e.g., 'Meta Advertising Operations', 'Clear Channel Digital')",
            max_length=255,
            min_length=1,
        ),
    ]
    seller_id: Annotated[
        str | None,
        Field(
            description="Seller ID from IAB Tech Lab sellers.json (if applicable)",
            max_length=255,
            min_length=1,
        ),
    ] = None
    tag_id: Annotated[
        str | None,
        Field(
            description="TAG Certified Against Fraud ID for verification (if applicable)",
            max_length=100,
            min_length=1,
        ),
    ] = None


class Tags(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    description: Annotated[str, Field(description="Description of what this tag represents")]
    name: Annotated[str, Field(description="Human-readable name for this tag")]


class AuthorizedAgents2(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    authorization_type: Annotated[
        Literal["inline_properties"],
        Field(description="Discriminator indicating authorization by inline property definitions"),
    ]
    authorized_for: Annotated[
        str,
        Field(
            description="Human-readable description of what this agent is authorized to sell",
            max_length=500,
            min_length=1,
        ),
    ]
    properties: Annotated[
        list[property.Property],
        Field(
            description="Specific properties this agent is authorized for (alternative to property_ids/property_tags)",
            min_length=1,
        ),
    ]
    url: Annotated[AnyUrl, Field(description="The authorized agent's API endpoint URL")]


class AuthorizedSalesAgents(AdCPBaseModel):
    model_config = ConfigDict(
        extra="forbid",
    )
    field_schema: Annotated[
        str | None,
        Field(alias="$schema", description="JSON Schema identifier for this adagents.json file"),
    ] = "https://adcontextprotocol.org/schemas/v1/adagents.json"
    authorized_agents: Annotated[
        list[AuthorizedAgents | AuthorizedAgents1 | AuthorizedAgents2 | AuthorizedAgents3],
        Field(
            description="Array of sales agents authorized to sell inventory for properties in this file",
            min_length=1,
        ),
    ]
    contact: Annotated[
        Contact | None,
        Field(
            description="Contact information for the entity managing this adagents.json file (may be publisher or third-party operator)"
        ),
    ] = None
    last_updated: Annotated[
        AwareDatetime | None,
        Field(description="ISO 8601 timestamp indicating when this file was last updated"),
    ] = None
    properties: Annotated[
        list[property.Property] | None,
        Field(
            description="Array of all properties covered by this adagents.json file. Same structure as list_authorized_properties response.",
            min_length=1,
        ),
    ] = None
    tags: Annotated[
        dict[str, Tags] | None,
        Field(
            description="Metadata for each tag referenced by properties. Same structure as list_authorized_properties response."
        ),
    ] = None
