import { axiosInstance } from './client';

// ─── Types ────────────────────────────────────────────────────────────────

export type FacebookCampaignStatus = 'ACTIVE' | 'PAUSED' | 'DELETED' | 'UNKNOWN';

export interface FacebookAdsCampaign {
  id: string;
  company_id: string;
  external_id: string;
  name: string;
  status: FacebookCampaignStatus;
  budget: number | null;
  budget_type: string;
  channel_type: string;
  start_date?: string;
  end_date?: string;
  parent_campaign_id?: string;
  total_spend: number;
  total_clicks: number;
  total_conversions: number;
  metadata?: Record<string, unknown>;
  created_at: string;
  updated_at: string;
}

export interface FacebookAdsMetric {
  id: string;
  company_id: string;
  external_campaign_id: string;
  metric_date: string;
  spend: number;
  impressions: number;
  clicks: number;
  conversions: number;
  ctr: number | null;
  cpc: number | null;
  cpv: number | null;
  roas: number | null;
  created_at: string;
}

export interface FacebookAdsAnalytics {
  total_campaigns: number;
  active_campaigns: number;
  paused_campaigns: number;
  total_spend_30d: number;
  total_spend_90d: number;
  total_spend_ytd: number;
  total_impressions_30d: number;
  total_clicks_30d: number;
  total_conversions_30d: number;
  avg_ctr: number;
  avg_cpc: number;
  avg_cpa: number;
  total_roas: number;
  campaigns_by_status?: { status: string; count: number; total_budget: number }[];
  campaigns_by_channel?: { channel_type: string; count: number; total_spend: number }[];
  top_campaigns?: { name: string; external_id: string; spend: number; clicks: number; conversions: number; status: string }[];
  daily_spend_trend?: { date: string; spend: number; clicks: number; impressions: number; conversions: number }[];
}

// ─── API ──────────────────────────────────────────────────────────────────

const baseUrl = (companyId: string) => `/api/company/${companyId}/facebook_ads`;

export const facebookAdsApi = {
  // Campaigns
  async getCampaigns(
    companyId: string,
    params?: { status?: string; search?: string; channel?: string; page?: number; per_page?: number }
  ): Promise<{ success: boolean; data: { items: FacebookAdsCampaign[]; total: number; page: number; per_page: number } }> {
    const response = await axiosInstance.get(`${baseUrl(companyId)}/campaigns`, { params });
    return response.data;
  },

  async getCampaign(
    companyId: string,
    campaignId: string
  ): Promise<{ success: boolean; data: FacebookAdsCampaign }> {
    const response = await axiosInstance.get(`${baseUrl(companyId)}/campaigns/${campaignId}`);
    return response.data;
  },

  // Metrics
  async getMetrics(
    companyId: string,
    params?: { campaign_id?: string; date_from?: string; date_to?: string; page?: number; per_page?: number }
  ): Promise<{ success: boolean; data: { items: FacebookAdsMetric[]; total: number; page: number; per_page: number } }> {
    const response = await axiosInstance.get(`${baseUrl(companyId)}/metrics`, { params });
    return response.data;
  },

  // Analytics
  async getAnalytics(companyId: string): Promise<{ success: boolean; data: FacebookAdsAnalytics }> {
    const response = await axiosInstance.get(`${baseUrl(companyId)}/analytics`);
    return response.data;
  },

  // Sync
  async sync(companyId: string): Promise<{ success: boolean; data: { message: string } }> {
    const response = await axiosInstance.post(`${baseUrl(companyId)}/sync`);
    return response.data;
  },
};
