import datetime from pydantic import AnyHttpUrl, BaseModel, Field from dmp.api.schemas import AssignLabelsToAdPlatformUserAdAccountsInput from dmp.app_connections.enums import AppConnectionStatus from dmp.audiences.enums import ( AudienceExportJustification, AudienceExportStatus, ) from dmp.core.types import EncryptedToken, PlainToken from dmp.tiktok.enums import TikTokUserConnectionStatus from dmp.tiktok.types import TikTokAdAccountOrderBy # Always populate by name BaseModel.model_config["populate_by_name"] = True class ConnectTikTokUserInput(BaseModel): access_token: PlainToken = Field(alias="accessToken") class TikTokUserInput(BaseModel): user_id: str = Field(alias="userId", description="TikTok user id") class TikTokUserConnectionAdAccount(BaseModel): id: str external_id: str = Field(alias="externalId") name: str business_center_name: str | None = Field(alias="businessCenterName") class TikTokUserConnectionResponse(BaseModel): user_id: str | None = Field(alias="userId") user_name: str | None = Field(alias="userName") status: TikTokUserConnectionStatus ad_accounts: list[TikTokUserConnectionAdAccount] = Field(alias="adAccounts") ad_accounts_count: int = Field(alias="adAccountsCount") class TikTokAdAccount(BaseModel): id: str user_ad_account_id: str | None = Field(alias="userAdAccountId") user_id: str | None = Field(alias="userId", description="TikTok user id") external_id: str = Field(alias="externalId") name: str business_center_name: str | None = Field(alias="businessCenterName") vendor_id: int | None = Field(alias="vendorId") subaccount_id: int | None = Field(alias="subaccountId") is_self_connected: bool = Field(alias="isSelfConnected") user_connection_status: TikTokUserConnectionStatus = Field( alias="userConnectionStatus" ) user_self_connected: bool = Field(alias="userSelfConnected") ad_reporting_connection_status: AppConnectionStatus = Field( alias="adReportingConnectionStatus" ) sharing_user_id: str | None = Field( alias="sharingUserId", description="TikTok user id for sharing connection" ) reporting_user_id: str | None = Field( alias="reportingUserId", description="TikTok user id for reporting connection" ) ad_reporting_self_connected: bool = Field(alias="adReportingSelfConnected") campaigns_count: int = Field(alias="campaignsCount") class TikTokUserAdAccount(BaseModel): id: str name: str business_center_name: str | None = Field(alias="businessCenterName") vendor_id: int | None = Field(alias="vendorId") subaccount_id: int | None = Field(alias="subaccountId") class AssignLabelsToTikTokUserAdAccountsInput( AssignLabelsToAdPlatformUserAdAccountsInput ): pass class RefreshTikTokAdReportingConnectionInput(BaseModel): fivetran_connection_id: str = Field(alias="fivetranConnectorId") class ShareTikTokAudienceInput(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 TikTokAudience(BaseModel): id: str external_id: str | None = Field(alias="externalId") name: str fans_count: int = Field(alias="fansCount") created_at: datetime.datetime = Field(alias="createdAt") class TikTokAudienceShareStatus(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 TikTokAudienceShare(BaseModel): audience_id: str = Field(alias="audienceId") audience_external_id: str | None = 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 UpdateTikTokAudienceInput(BaseModel): external_id: str = Field(alias="externalId") class ConnectTikTokAdReportingInput(BaseModel): user_id: str = Field(alias="userId") redirect_uri: AnyHttpUrl = Field(alias="redirectUri") class TikTokAdReportingConnection(BaseModel): status: AppConnectionStatus ad_accounts_count: int = Field(alias="adAccountsCount") class GetTikTokAdAccountsInput(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[TikTokAdAccountOrderBy] | None = Field(None, alias="orderBy") class DeleteTikTokAdAccountsInput(BaseModel): vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId")