using System.Text.Json.Serialization; namespace MetaApi.Models; #region Campaign Payloads /// /// Create a Meta campaign. /// Meta hierarchy: Campaign → Ad Set → Ad /// With Advantage+ (v25.0+), this uses the unified campaign API. /// public sealed class CreateCampaignPayload { public string Name { get; set; } = string.Empty; public MetaObjective Objective { get; set; } = MetaObjective.Conversions; /// /// Campaign spending limit in account currency (in cents). /// Null = no campaign spending limit. /// public long? SpendCapCents { get; set; } /// /// Special ad categories required by Meta for housing, employment, credit, etc. /// Empty = none (most campaigns). /// public List SpecialAdCategories { get; set; } = new(); public MetaCampaignStatus Status { get; set; } = MetaCampaignStatus.Paused; } public sealed class GetCampaignPayload { public string CampaignId { get; set; } = string.Empty; } public sealed class UpdateCampaignPayload { public string CampaignId { get; set; } = string.Empty; public string? Name { get; set; } public MetaCampaignStatus? Status { get; set; } public long? SpendCapCents { get; set; } } public sealed class ListCampaignsPayload { public MetaCampaignStatus? StatusFilter { get; set; } public int Limit { get; set; } = 50; public string? After { get; set; } // Cursor-based pagination } #endregion #region Ad Set Payloads /// /// Create a Meta Ad Set (equivalent to Google Ad Group). /// Ad Sets define targeting, budget, schedule, and bid strategy. /// public sealed class CreateAdSetPayload { public string CampaignId { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; /// Daily budget in account currency cents. public long DailyBudgetCents { get; set; } /// Lifetime budget in cents (alternative to daily). Null = use daily. public long? LifetimeBudgetCents { get; set; } public string? StartTime { get; set; } // ISO 8601 public string? EndTime { get; set; } // ISO 8601 public MetaBillingEvent BillingEvent { get; set; } = MetaBillingEvent.Impressions; public MetaOptimizationGoal OptimizationGoal { get; set; } = MetaOptimizationGoal.LinkClicks; /// Target CPA bid amount in cents (for CPA bidding). public long? BidAmountCents { get; set; } public MetaCampaignStatus Status { get; set; } = MetaCampaignStatus.Paused; } #endregion #region Ad Account Payloads /// /// Create a new ad account under USIM's Business Manager. /// Requires Advanced Access to business_management permission. /// public sealed class CreateAdAccountPayload { /// Display name for the new ad account. public string Name { get; set; } = string.Empty; /// Currency code (e.g. "USD"). ISO 4217. public string Currency { get; set; } = "USD"; /// Timezone (IANA format, e.g. "America/Los_Angeles"). Numeric TZ ID also accepted. public int TimezoneId { get; set; } = 1; // Default: America/Los_Angeles /// End advertiser name/business for the account. public string? EndAdvertiser { get; set; } /// Media agency managing the account. public string? MediaAgency { get; set; } /// Partner (USIM). public string? Partner { get; set; } } #endregion #region Insights Payloads /// /// Retrieve campaign performance metrics (Meta Insights API). /// public sealed class CampaignInsightsPayload { public string CampaignId { get; set; } = string.Empty; public string? DatePreset { get; set; } // e.g., "last_7d", "last_30d", "this_month" public string? StartDate { get; set; } // YYYY-MM-DD (time_range) public string? EndDate { get; set; } // YYYY-MM-DD (time_range) public string Level { get; set; } = "campaign"; // campaign, adset, ad } public sealed class AccountInsightsPayload { public string? DatePreset { get; set; } public string? StartDate { get; set; } public string? EndDate { get; set; } } #endregion #region Enums /// /// Meta campaign objectives. /// As of API v25.0, Meta is consolidating to Outcome-Driven Ad Experiences (ODAX). /// These map to the Advantage+ unified campaign objectives. /// [JsonConverter(typeof(JsonStringEnumConverter))] public enum MetaObjective { /// OUTCOME_AWARENESS - Brand awareness and reach Awareness = 0, /// OUTCOME_TRAFFIC - Drive traffic to a destination Traffic = 1, /// OUTCOME_ENGAGEMENT - Get more engagement (likes, comments, shares) Engagement = 2, /// OUTCOME_LEADS - Generate leads Leads = 3, /// OUTCOME_APP_PROMOTION - Drive app installs AppPromotion = 4, /// OUTCOME_SALES - Drive conversions/sales Conversions = 5 } /// /// Meta campaign/ad set status values. /// [JsonConverter(typeof(JsonStringEnumConverter))] public enum MetaCampaignStatus { Active = 0, Paused = 1, Deleted = 2, Archived = 3 } /// /// Meta billing events for ad sets. /// [JsonConverter(typeof(JsonStringEnumConverter))] public enum MetaBillingEvent { Impressions = 0, LinkClicks = 1, ThruPlay = 2 } /// /// Meta optimization goals for ad sets. /// [JsonConverter(typeof(JsonStringEnumConverter))] public enum MetaOptimizationGoal { None = 0, LinkClicks = 1, Impressions = 2, Reach = 3, LandingPageViews = 4, LeadGeneration = 5, Conversions = 6, Value = 7 } #endregion