import datetime from pydantic import BaseModel, ConfigDict, Field from dmp.ad_reporting.enums import ( AdReportingActionType, AdReportingAdEffectiveStatus, AdReportingAdSetEffectiveStatus, AdReportingBudgetType, AdReportingCampaignEffectiveStatus, AdReportingCreativeType, AdReportingObjective, AdReportingPlatform, AdReportingRateType, ) from dmp.ad_reporting.types import ( AdReportingAdOrderBy, AdReportingAdSetOrderBy, AdReportingCampaignOrderBy, AdReportingReportOrderBy, ) from dmp.api.schemas import LabelId, LimitOffsetPage from dmp.core.types import UUID4Str # Always populate by name BaseModel.model_config["populate_by_name"] = True class AdReportingCampaign(BaseModel): id: str external_id: str = Field(alias="externalId") name: str account_id: str = Field(alias="accountId") global_participant_ids: list[str] = Field(alias="globalParticipantIds") accounts: list[LabelId] = Field(default_factory=list) platform: AdReportingPlatform objective: AdReportingObjective targeting_countries: list[str] = Field(alias="targetingCountries") reporting_url: str = Field(alias="reportingUrl") effective_status: AdReportingCampaignEffectiveStatus = Field( alias="effectiveStatus" ) start_at: datetime.datetime = Field(alias="startAt") end_at: datetime.datetime = Field(alias="endAt") clicks: int impressions: int reach: int | None | None estimated_ad_recallers: int | None = Field(alias="estimatedAdRecallers") views_p25: int = Field(alias="viewsP25") views: int purchases: int | None follows: int | None spend: float currency: str spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None actions: int action_type: AdReportingActionType = Field(alias="actionType") rate: float rate_type: AdReportingRateType = Field(alias="rateType") cost_per_action: float = Field(alias="costPerAction") cost_per_action_usd: float = Field(alias="costPerActionUSD") frequency: float | None benchmark: float | None vs_benchmark: float | None = Field(alias="vsBenchmark") artist_benchmark: float | None = Field(alias="artistBenchmark") vs_artist_benchmark: float | None = Field(alias="vsArtistBenchmark") budget: float | None budget_usd: float | None = Field(alias="budgetUSD") budget_type: AdReportingBudgetType = Field(alias="budgetType") is_included_in_report: bool = Field(alias="isIncludedInReport") report_id: str | None = Field(None, alias="reportId") report_name: str | None = Field(None, alias="reportName") model_config = ConfigDict(from_attributes=True) class AdReportingSummary(BaseModel): total: int clicks: int impressions: int reach: int | None estimated_ad_recallers: int | None = Field(alias="estimatedAdRecallers") views_p25: int = Field(alias="viewsP25") views: int purchases: int follows: int spend: float | None spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None budget: float | None currency: str | None budget_usd: float | None = Field(alias="budgetUSD") budget_type: AdReportingBudgetType | None = Field(alias="budgetType") actions: int | None rate: float | None cost_per_action: float | None = Field(alias="costPerAction") cost_per_action_usd: float | None = Field(alias="costPerActionUSD") frequency: float | None action_type: AdReportingActionType | None = Field(alias="actionType") rate_type: AdReportingRateType | None = Field(alias="rateType") model_config = ConfigDict(from_attributes=True) class GetAdReportingCampaignsInput(BaseModel): search: str | None = Field( None, description="A search term", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) platform: AdReportingPlatform | None = Field( None, description="Platform", ) objective: AdReportingObjective | None = Field( None, description="Objective", ) countries: list[str] | None = Field( None, description="Country ISO2 list", ) report_id: str | None = Field( None, alias="reportId", description="reportId", ) order_by: list[AdReportingCampaignOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=5000, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class GetAdReportingReportCampaignsInput(BaseModel): search: str | None = Field( None, description="A search term", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) platform: AdReportingPlatform | None = Field( None, description="Platform", ) objective: AdReportingObjective | None = Field( None, description="Objective", ) countries: list[str] | None = Field( None, description="Country ISO2 list", ) order_by: list[AdReportingCampaignOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=5000, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class GetAdReportingCampaignsOutput(LimitOffsetPage[AdReportingCampaign]): summary: AdReportingSummary class GetAdReportingReportsArtistsInput(BaseModel): report_id: str | None = Field(None, alias="reportId") class GetAdReportingCampaignReportsInput(BaseModel): search: str | None = Field(None, description="A search term") class AdReportingCampaignObjective(BaseModel): platform: AdReportingPlatform objective: AdReportingObjective class GetAdReportingCampaignsObjectivesInput(BaseModel): report_id: str | None = Field( None, alias="reportId", description="Report id", ) class AdReportingCampaignIdName(BaseModel): id: str name: str class GetAdReportingCampaignsNamesInput(BaseModel): search: str | None = Field( None, description="A search term", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) platform: AdReportingPlatform | None = Field( None, description="Platform", ) objective: AdReportingObjective | None = Field( None, description="Objective", ) report_id: str | None = Field( None, alias="reportId", description="Report id", ) limit: int | None = Field( None, ge=1, le=500, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class AdReportingAdSetIdName(BaseModel): id: str name: str class GetAdReportingAdSetsNamesInput(BaseModel): search: str | None = Field( None, description="A search term", ) campaign_id: str | None = Field( None, alias="campaignId", description="Campaign id", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) platform: AdReportingPlatform | None = Field( None, description="Platform", ) objective: AdReportingObjective | None = Field( None, description="Objective", ) report_id: str | None = Field( None, alias="reportId", description="Report id", ) order_by: list[AdReportingAdSetOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=500, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class AdReportingCampaignToplinePerformance(BaseModel): platform: AdReportingPlatform objective: AdReportingObjective clicks: int impressions: int reach: int | None estimated_ad_recallers: int | None = Field(alias="estimatedAdRecallers") views_p25: int = Field(alias="viewsP25") views: int purchases: int | None follows: int | None currency: str | None spend: float | None spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None actions: int action_type: AdReportingActionType = Field(alias="actionType") rate: float rate_type: AdReportingRateType = Field(alias="rateType") benchmark: float | None vs_benchmark: float | None = Field(alias="vsBenchmark") artist_benchmark: float | None = Field(alias="artistBenchmark") vs_artist_benchmark: float | None = Field(alias="vsArtistBenchmark") cost_per_action: float | None = Field(alias="costPerAction") cost_per_action_usd: float = Field(alias="costPerActionUSD") frequency: float | None class AdReportingCampaignCountryToplinePerformance( AdReportingCampaignToplinePerformance ): country_code: str = Field(alias="countryCode") class AdReportingAdSet(BaseModel): id: str name: str campaign_id: str = Field(alias="campaignId") campaign_name: str = Field(alias="campaignName") account_id: str = Field(alias="accountId") global_participant_ids: list[str] = Field(alias="globalParticipantIds") accounts: list[LabelId] = Field(default_factory=list) platform: AdReportingPlatform objective: AdReportingObjective targeting_countries: list[str] = Field(alias="targetingCountries") reporting_url: str = Field(alias="reportingUrl") effective_status: AdReportingAdSetEffectiveStatus = Field(alias="effectiveStatus") start_at: datetime.datetime = Field(alias="startAt") end_at: datetime.datetime = Field(alias="endAt") clicks: int impressions: int reach: int | None estimated_ad_recallers: int | None = Field(alias="estimatedAdRecallers") views_p25: int = Field(alias="viewsP25") views: int purchases: int | None follows: int | None currency: str spend: float spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None actions: int action_type: AdReportingActionType = Field(alias="actionType") rate: float rate_type: AdReportingRateType = Field(alias="rateType") cost_per_action: float = Field(alias="costPerAction") cost_per_action_usd: float = Field(alias="costPerActionUSD") frequency: float | None benchmark: float | None vs_benchmark: float | None = Field(alias="vsBenchmark") artist_benchmark: float | None = Field(alias="artistBenchmark") vs_artist_benchmark: float | None = Field(alias="vsArtistBenchmark") budget: float | None budget_usd: float | None = Field(alias="budgetUSD") budget_type: AdReportingBudgetType = Field(alias="budgetType") report_id: str | None = Field(None, alias="reportId") report_name: str | None = Field(None, alias="reportName") model_config = ConfigDict(from_attributes=True) class GetAdReportingAdSetsInput(BaseModel): search: str | None = Field( None, description="A search term", ) campaign_id: str | None = Field( None, alias="campaignId", description="Campaign id", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) platform: AdReportingPlatform | None = Field( None, description="Platform", ) objective: AdReportingObjective | None = Field( None, description="Objective", ) countries: list[str] | None = Field( None, description="Country ISO2 list", ) order_by: list[AdReportingAdSetOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=5000, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class GetAdReportingAdSetsOutput(LimitOffsetPage[AdReportingAdSet]): summary: AdReportingSummary class AdReportingAd(BaseModel): id: str name: str campaign_id: str = Field(alias="campaignId") campaign_name: str = Field(alias="campaignName") ad_set_id: str = Field(alias="adSetId") ad_set_name: str = Field(alias="adSetName") account_id: str = Field(alias="accountId") global_participant_ids: list[str] = Field(alias="globalParticipantIds") accounts: list[LabelId] = Field(default_factory=list) platform: AdReportingPlatform objective: AdReportingObjective targeting_countries: list[str] = Field(alias="targetingCountries") reporting_url: str = Field(alias="reportingUrl") effective_status: AdReportingAdEffectiveStatus = Field(alias="effectiveStatus") start_at: datetime.datetime = Field(alias="startAt") end_at: datetime.datetime = Field(alias="endAt") clicks: int impressions: int reach: int | None estimated_ad_recallers: int | None = Field(alias="estimatedAdRecallers") views_p25: int = Field(alias="viewsP25") views: int purchases: int | None follows: int | None currency: str spend: float spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None actions: int action_type: AdReportingActionType = Field(alias="actionType") rate: float rate_type: AdReportingRateType = Field(alias="rateType") cost_per_action: float = Field(alias="costPerAction") cost_per_action_usd: float = Field(alias="costPerActionUSD") frequency: float | None creative_url: str | None = Field(alias="creativeUrl") creative_type: AdReportingCreativeType | None = Field(alias="creativeType") thumbnail_url: str | None = Field(alias="thumbnailUrl") creative_thumbnail: str | None = Field(alias="creativeThumbnail") benchmark: float | None vs_benchmark: float | None = Field(alias="vsBenchmark") artist_benchmark: float | None = Field(alias="artistBenchmark") vs_artist_benchmark: float | None = Field(alias="vsArtistBenchmark") budget_type: AdReportingBudgetType = Field(alias="budgetType") report_id: str | None = Field(None, alias="reportId") report_name: str | None = Field(None, alias="reportName") model_config = ConfigDict(from_attributes=True) class AdReportingAdGroup(BaseModel): name: str campaign_id: str | None = Field(alias="campaignId") campaign_name: str | None = Field(alias="campaignName") ad_set_id: str | None = Field(alias="adSetId") ad_set_name: str | None = Field(alias="adSetName") global_participant_ids: list[str] = Field(alias="globalParticipantIds") accounts: list[LabelId] = Field(default_factory=list) platforms: list[AdReportingPlatform] objectives: list[AdReportingObjective] targeting_countries: list[str] = Field(alias="targetingCountries") effective_status: AdReportingAdEffectiveStatus | None = Field( alias="effectiveStatus", ) start_at: datetime.datetime = Field(alias="startAt") end_at: datetime.datetime = Field(alias="endAt") clicks: int impressions: int reach: int | None estimated_ad_recallers: int | None = Field(alias="estimatedAdRecallers") views_p25: int = Field(alias="viewsP25") views: int purchases: int | None follows: int | None currency: str | None spend: float | None spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None actions: int | None action_type: AdReportingActionType | None = Field(alias="actionType") rate: float | None cost_per_action: float | None = Field(alias="costPerAction") cost_per_action_usd: float | None = Field(alias="costPerActionUSD") frequency: float | None thumbnail_url: str | None = Field(alias="thumbnailUrl") benchmark: float | None vs_benchmark: float | None = Field(alias="vsBenchmark") artist_benchmark: float | None = Field(alias="artistBenchmark") vs_artist_benchmark: float | None = Field(alias="vsArtistBenchmark") total_actions_ratio: float | None = Field(alias="totalActionsRatio") rate_type: AdReportingRateType | None = Field(alias="rateType") items: list[AdReportingAd] model_config = ConfigDict(from_attributes=True) class GetAdReportingAdsInput(BaseModel): search: str | None = Field( None, description="A search term", ) campaign_id: str | None = Field( None, alias="campaignId", description="Campaign id", ) ad_set_id: str | None = Field( None, alias="adSetId", description="Ad set id", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) platform: AdReportingPlatform | None = Field( None, description="Platform", ) objective: AdReportingObjective | None = Field( None, description="Objective", ) countries: list[str] | None = Field( None, description="Country ISO2 list", ) order_by: list[AdReportingAdOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=5000, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class GetAdReportingAdsOutput(LimitOffsetPage[AdReportingAd]): summary: AdReportingSummary class GetAdReportingAdsGroupedResponse(LimitOffsetPage[AdReportingAdGroup]): summary: AdReportingSummary class AddAdReportingReportToCampaignsInput(BaseModel): campaign_ids: set[str] | None = Field(None, alias="campaignIds") search: str | None = None global_participant_id: str | None = Field(None, alias="globalParticipantId") platform: AdReportingPlatform | None = None objective: AdReportingObjective | None = None countries: list[str] | None = None class AddAdReportingReportToCampaignsOutput(BaseModel): campaigns_added: int = Field(alias="campaignsAdded") class AdReportingReport(BaseModel): id: str name: str created_at: datetime.datetime = Field(alias="createdAt") created_by: str = Field(alias="createdBy") updated_at: datetime.datetime = Field(alias="updatedAt") class CreateAdReportingReportInput(BaseModel): name: str = Field(min_length=1) campaign_ids: set[str] | None = Field(None, alias="campaignIds") search: str | None = None global_participant_id: str | None = Field(None, alias="globalParticipantId") platform: AdReportingPlatform | None = None objective: AdReportingObjective | None = None countries: list[str] | None = None model_config = ConfigDict(str_strip_whitespace=True) class AdReportingReportOverview(BaseModel): id: str name: str campaigns_count: int = Field(alias="campaignsCount") start_at: datetime.datetime | None = Field(alias="startAt") end_at: datetime.datetime | None = Field(alias="endAt") impressions: int clicks: int views_p25: int = Field(alias="viewsP25") views: int currency: str | None spend: float | None spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None topline_performance: list[AdReportingCampaignToplinePerformance] = Field( alias="toplinePerformance" ) topline_country_performance: list[AdReportingCampaignCountryToplinePerformance] = ( Field(alias="toplineCountryPerformance") ) created_at: datetime.datetime = Field(alias="createdAt") created_by: str = Field(alias="createdBy", validation_alias="identity_id") class AdReportingReportView(BaseModel): id: str name: str global_participant_ids: list[str] = Field(alias="globalParticipantIds") start_at: datetime.datetime | None = Field(alias="startAt") end_at: datetime.datetime | None = Field(alias="endAt") impressions: int clicks: int views_p25: int = Field(alias="viewsP25") views: int spend_usd: float = Field(alias="spendUSD") likes: int | None complete_payment: int | None = Field(alias="completePayment") checkout: int | None spend: float = Field( validation_alias="spend_usd", description="In USD (deprecated)" ) created_at: datetime.datetime = Field(alias="createdAt") created_by: str = Field(alias="createdBy") class GetAdReportingReportsInput(BaseModel): search: str | None = Field( None, description="A search term", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) platform: AdReportingPlatform | None = Field( None, description="Platform", ) order_by: list[AdReportingReportOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=5000, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class AdReportingCampaignReport(BaseModel): report_id: str = Field(alias="reportId") report_name: str = Field(alias="reportName") has_campaign_included: bool = Field(alias="hasCampaignIncluded") class EditAdReportingReportInput(BaseModel): name: str = Field(min_length=1) model_config = ConfigDict(str_strip_whitespace=True) class AddAdReportingCampaignToReportsInput(BaseModel): report_ids: set[str] = Field(alias="reportIds", min_length=1) class AssignArtistToAdReportingCampaignInput(BaseModel): global_participant_id: str = Field(alias="globalParticipantId") class AssignArtistsToAdReportingCampaignInput(BaseModel): global_participant_ids: set[UUID4Str] = Field( alias="globalParticipantIds", min_length=1 )