import datetime from pydantic import AnyHttpUrl, BaseModel, Field from dmp.api.schemas import ( AdReportingConnection, AssignLabelsToAdPlatformUserAdAccountsInput, ) from dmp.app_connections.enums import AppConnectionStatus from dmp.audiences.enums import AudienceExportJustification, AudienceExportStatus from dmp.core.types import EncryptedToken, PlainToken from dmp.meta.enums import MetaUserConnectionStatus from dmp.meta.types import MetaAdAccountOrderBy # Always populate by name BaseModel.model_config["populate_by_name"] = True class MetaUser(BaseModel): name: str picture: str | None granted_scopes: list[str] = Field(alias="grantedScopes") class MetaUserConnectionAdAccount(BaseModel): id: str external_id: str = Field(alias="externalId") name: str business_account_name: str | None = Field(alias="businessAccountName") business_account_picture: str | None = Field(alias="businessAccountPicture") custom_audience_tos_accepted: bool = Field(alias="customAudienceTosAccepted") custom_audience_tos_url: AnyHttpUrl = Field(alias="customAudienceTosUrl") class MetaUserConnection(BaseModel): user: MetaUser | None status: MetaUserConnectionStatus required_scopes: list[str] = Field(alias="requiredScopes") ad_accounts: list[MetaUserConnectionAdAccount] = Field(alias="adAccounts") ad_accounts_count: int = Field(alias="adAccountsCount") class ConnectMetaUserInput(BaseModel): user_id: str = Field(alias="userId") access_token: PlainToken = Field(alias="accessToken") class ConnectMetaAdReportingInput(BaseModel): redirect_uri: AnyHttpUrl = Field(alias="redirectUri") class MetaAdReportingConnection(AdReportingConnection): pass class MetaAudienceAdAccount(BaseModel): id: str name: str 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 = Field(alias="customAudienceTosUrl") class MetaUserAdAccount(BaseModel): id: str name: str business_account_name: str | None = Field(alias="businessAccountName") business_account_picture: str | None = Field(alias="businessAccountPicture") vendor_id: int | None = Field(alias="vendorId") subaccount_id: int | None = Field(alias="subaccountId") class MetaAdAccount(BaseModel): id: str user_ad_account_id: str | None = Field(alias="userAdAccountId") external_id: str = Field(alias="externalId") name: str business_account_name: str | None = Field(alias="businessAccountName") business_account_picture: str | None = Field(alias="businessAccountPicture") vendor_id: int | None = Field(alias="vendorId") subaccount_id: int | None = Field(alias="subaccountId") is_self_connected: bool = Field(alias="isSelfConnected") user_connection_status: MetaUserConnectionStatus = Field( alias="userConnectionStatus" ) user_self_connected: bool = Field(alias="userSelfConnected") ad_reporting_connection_status: AppConnectionStatus = Field( alias="adReportingConnectionStatus" ) ad_reporting_self_connected: bool = Field(alias="adReportingSelfConnected") campaigns_count: int = Field(alias="campaignsCount") class RefreshMetaAdReportingConnectionInput(BaseModel): fivetran_connection_id: str = Field(alias="fivetranConnectorId") class ShareMetaAudienceInput(BaseModel): audience_id: str = Field(alias="audienceId") ad_account_id: str = Field(alias="adAccountId") justification: AudienceExportJustification reason_notes: str | None = Field(None, alias="reasonNotes") class MetaAudience(BaseModel): id: str external_id: str = Field(alias="externalId") name: str fans_count: int = Field(alias="fansCount") created_at: datetime.datetime = Field(alias="createdAt") class MetaAudienceShareStatus(BaseModel): audience_id: str = Field(alias="audienceId") audience_name: str = Field(alias="audienceName") ad_account_name: str = Field(alias="adAccountName") status: AudienceExportStatus fans_count: int = Field(alias="fansCount") processed_fans: int = Field(alias="processedFans") progress: float seconds_remaining: int | None = Field(alias="secondsRemaining") url: str class MetaAudienceShare(BaseModel): audience_id: str = Field(alias="audienceId") audience_external_id: str = Field(alias="audienceExternalId") audience_name: str = Field(alias="audienceName") fans_count: int = Field(alias="fansCount") ad_account_external_id: str = Field(alias="adAccountExternalId") user_access_token: EncryptedToken = Field(alias="userAccessToken") class AssignLabelsToMetaUserAdAccountsInput( AssignLabelsToAdPlatformUserAdAccountsInput ): pass class DeleteMetaAdAccountsInput(BaseModel): vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId") class GetMetaAdAccountsInput(BaseModel): vendor_id: int | None = Field(None, alias="vendorId") subaccount_id: int | None = Field(None, alias="subaccountId") limit: int | None = Field(None) offset: int | None = Field(None) order_by: list[MetaAdAccountOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", )