from __future__ import annotations import enum from typing import Any from pydantic import BaseModel from dmp.core.types import PlainToken # Generic response models class Cursors(BaseModel): before: str after: str class Paging(BaseModel): cursors: Cursors next: str | None = None class Response[T](BaseModel): data: T paging: Paging | None = None class Error(BaseModel): message: str | None = None type: str | None = None code: int fbtrace_id: str | None = None error_subcode: int | None = None error_user_title: str | None = None error_user_msg: str | None = None error_data: str | dict[str, Any] | None = None class ErrorResponse(BaseModel): error: Error class AccessToken(BaseModel): access_token: PlainToken expires_in: int | None = None class DebugToken(BaseModel): is_valid: bool scopes: list[str] class Picture(BaseModel): url: str class PictureData(BaseModel): data: Picture class User(BaseModel): id: str name: str picture: PictureData class Business(User): pass class Summary(BaseModel): total_count: int class CampaignsResponse(BaseModel): summary: Summary class UserAdAccountTask(enum.StrEnum): OTHER = "OTHER" MANAGE = "MANAGE" @classmethod def _missing_(cls, value: object) -> UserAdAccountTask: # noqa: ARG003 return cls.OTHER class TOSAcceptance(BaseModel): custom_audience_tos: bool | None = None class UserAdAccount(BaseModel): id: str name: str user_tasks: list[UserAdAccountTask] = [] business: Business | None = None campaigns: CampaignsResponse tos_accepted: TOSAcceptance | None = None @property def is_manageable(self) -> bool: return UserAdAccountTask.MANAGE in self.user_tasks @property def is_eligible(self) -> bool: return self.business is not None and self.is_manageable @property def custom_audience_tos_accepted(self) -> bool: if self.tos_accepted is None: return False return bool(self.tos_accepted.custom_audience_tos) @property def business_account_name(self) -> str | None: if self.business is None: return None return self.business.name @property def business_account_picture(self) -> str | None: if self.business is None: return None return self.business.picture.data.url class CustomAudience(BaseModel): id: str class DisconnectUserResponse(BaseModel): success: bool