from dataclasses import dataclass, field from typing import Protocol, Self from fansifter_common.auth.account import Account from pydantic import BaseModel from dmp.app_connections.enums import AppConnectionStatus from dmp.tiktok.enums import TikTokUserConnectionStatus from dmp.tiktok.models import TikTokAdAccount class BusinessCenterAdAccount(Protocol): external_id: str name: str business_center_name: str | None campaigns_count: int @dataclass(kw_only=True) class TikTokUserConnectionAdAccount: id: str external_id: str name: str business_center_name: str | None @classmethod def from_model(cls, obj: TikTokAdAccount) -> Self: return cls( id=obj.id, external_id=obj.external_id, name=obj.name or obj.external_id, business_center_name=obj.business_center_name, ) @dataclass(kw_only=True) class TikTokUserConnectionResponse: user_id: str | None user_name: str | None status: TikTokUserConnectionStatus ad_accounts: list[TikTokUserConnectionAdAccount] = field(default_factory=list) ad_accounts_count: int = field(init=False) def __post_init__(self) -> None: self.ad_accounts_count = len(self.ad_accounts) class TikTokUserAdAccountLabel(BaseModel): id: str external_id: str name: str business_center_name: str | None campaigns_count: int vendor_id: int | None subaccount_id: int | None @dataclass class AssignTikTokUserAdAccountLabelData: ad_account_id: str vendor_id: int subaccount_id: int @property def account(self) -> Account: return Account(vendor_id=self.vendor_id, subaccount_id=self.subaccount_id) class TikTokAdAccountOverview(BaseModel): id: str user_ad_account_id: str | None user_id: str | None external_id: str name: str business_center_name: str | None vendor_id: int | None subaccount_id: int | None is_self_connected: bool user_connection_status: TikTokUserConnectionStatus user_self_connected: bool ad_reporting_connection_status: AppConnectionStatus ad_reporting_self_connected: bool sharing_user_id: str | None reporting_user_id: str | None campaigns_count: int