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