import datetime from pydantic import ( BaseModel, ConfigDict, Field, ) from dmp.audiences.enums import ( AudienceExportJustification, AudienceExportReason, AudienceExportStatus, AudienceSharePlatform, AudienceTarget, ) from dmp.audiences.filters import AudienceFilters from dmp.audiences.types import AudiencesOrderBy, FanDataListId from dmp.fandata.enums import FanSegment # Always populate by name BaseModel.model_config["populate_by_name"] = True class Audience(BaseModel): id: str name: str vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId") fandata_list_ids: list[FanDataListId] = Field(alias="fanDataListIds") target: AudienceTarget countries: list[str] fan_segments: list[FanSegment] = Field(alias="fanSegments") filters: AudienceFilters fan_count: int = Field(alias="fanCount") is_archived: bool = Field(alias="isArchived") created_at: datetime.datetime = Field(alias="createdAt") created_by: str = Field(alias="createdBy") updated_at: datetime.datetime = Field(alias="updatedAt") updated_by: str = Field(alias="updatedBy") refreshed_at: datetime.datetime | None = Field(alias="refreshedAt") refreshed_by: str | None = Field(alias="refreshedBy") class GetAudiencesInput(BaseModel): vendor_id: int | None = Field( None, alias="vendorId", description="Account vendor id", ) subaccount_id: int | None = Field( None, alias="subaccountId", description="Account subaccount id", ) search: str | None = Field( None, description="A search term", ) global_participant_id: str | None = Field( None, alias="globalParticipantId", description="Artist id", ) custom_list_id: str | None = Field( None, alias="customListId", description="Custom list id", ) audience_ids: list[str] | None = Field( None, alias="audienceIds", description="Audience ids", ) target: AudienceTarget | None = Field( None, description="Audience target", ) include_archived: bool = Field( False, alias="includeArchived", description="Include archived audiences", ) order_by: AudiencesOrderBy | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=200, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class CreateAudienceInput(BaseModel): name: str = Field(min_length=1) vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId") fandata_list_ids: list[FanDataListId] = Field([], alias="fanDataListIds") target: AudienceTarget filters: AudienceFilters model_config = ConfigDict(str_strip_whitespace=True) class UpdateAudienceInput(BaseModel): name: str = Field(min_length=1) target: AudienceTarget filters: AudienceFilters model_config = ConfigDict(str_strip_whitespace=True) class GetAudienceSizeInput(BaseModel): vendor_id: int = Field(alias="vendorId") target: AudienceTarget subaccount_id: int = Field(alias="subaccountId") fandata_list_ids: list[FanDataListId] = Field([], alias="fanDataListIds") filters: AudienceFilters class AudienceSizeOutput(BaseModel): size: int created_at: datetime.datetime = Field(alias="createdAt") class AudienceExport(BaseModel): id: str audience_id: str = Field(alias="audienceId") audience_name: str = Field(alias="audienceName") reason: AudienceExportReason justification: AudienceExportJustification reason_notes: str | None = Field(alias="reasonNotes") status: AudienceExportStatus created_at: datetime.datetime = Field(alias="createdAt") created_by: str = Field(alias="createdBy") updated_at: datetime.datetime = Field(alias="updatedAt") class ExportAudienceInput(BaseModel): reason: AudienceExportReason justification: AudienceExportJustification reason_notes: str | None = Field(None, alias="reasonNotes") class AudienceExportOutput(BaseModel): export: AudienceExport presigned_url: str | None = Field(alias="presignedUrl") class UpdateAudienceExportInput(BaseModel): status: AudienceExportStatus zip_key: str | None = Field(None, alias="zipKey") class AudienceShare(BaseModel): id: str platform: AudienceSharePlatform status: AudienceExportStatus fans_count: int = Field(alias="fansCount") created_at: datetime.datetime = Field(alias="createdAt") class UpdateAudienceShareInput(BaseModel): status: AudienceExportStatus processed_fans: int | None = Field(None, alias="processedFans") class AudienceAdAccount(BaseModel): id: str name: str platform: AudienceSharePlatform is_connected: bool = Field(alias="isConnected") is_self_connected: bool = Field(alias="isSelfConnected") custom_audience_tos_accepted: bool = Field(alias="customAudienceTosAccepted") custom_audience_tos_url: str | None = Field(alias="customAudienceTosUrl") class CreateTargetAudienceOutput(BaseModel): fan_count: int = Field(alias="fanCount")