import { axiosInstance } from './client';

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

export interface AdTemplate {
  id: string;
  name: string;
  slug: string;
  vertical: string;
  description: string;
  budget_recommendation: number | null;
  target_cpa: number | null;
  bidding_strategy: string;
  structure: Record<string, unknown> | null;
  is_active: boolean;
  created_at: string;
}

export interface AdCreative {
  id: string;
  vertical: string;
  service_type: string;
  ad_type: string;
  headlines: string[];
  descriptions: string[];
  total_impressions: number;
  total_clicks: number;
  total_conversions: number;
  avg_ctr: number | null;
  is_winner: boolean;
  is_active: boolean;
  created_at: string;
}

export interface OptimizationRule {
  id: string;
  name: string;
  rule_type: string;
  target_level: string;
  params: Record<string, unknown> | null;
  is_active: boolean;
  last_run_at: string | null;
  total_actions: number;
}

export interface OptimizationLog {
  id: string;
  rule_id: string | null;
  source_service: string;
  target_type: string;
  target_name: string;
  action: string;
  reason: string | null;
  status: string;
  created_at: string;
}

export interface LeadAttribution {
  id: string;
  utm_source: string;
  utm_campaign: string;
  utm_term: string;
  lead_source: string;
  attribution_status: string; // click | lead | deal
  click_cost: number | null;
  total_ad_spend: number | null;
  deal_amount: number | null;
  roas: number | null;
  created_at: string;
}

export interface AttributionSummary {
  total_spend: number;
  total_revenue: number;
  overall_roas: number;
  attribution_count: number;
}

export interface DashboardData {
  campaigns: {
    active: number;
    total_spend: number;
    total_impressions: number;
    total_clicks: number;
    total_conversions: number;
  };
  attribution: {
    total_revenue: number;
    overall_roas: number;
  };
  optimization: {
    active_rules: number;
    recent_actions: number;
  };
}

export interface DashboardStats {
  total_campaigns: number;
  active_campaigns: number;
  total_spend_30d: number;
  total_leads_30d: number;
  total_attributions: number;
  avg_cost_per_lead: number;
  total_roi: number;
  active_rules: number;
  total_creatives: number;
}

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

const BASE = '/api';

export const leadGenApi = {
  // ─── Templates (global) ────────────────────────────────────────────

  getTemplates: (vertical?: string) => {
    const params = vertical ? { vertical } : undefined;
    return axiosInstance.get<{ success: boolean; data: { templates: AdTemplate[]; total: number } }>(
      `${BASE}/lead-gen/templates`,
      { params },
    );
  },

  getTemplate: (templateId: string) =>
    axiosInstance.get<{ success: boolean; data: AdTemplate }>(
      `${BASE}/lead-gen/templates/${templateId}`,
    ),

  createTemplate: (payload: Partial<AdTemplate>) =>
    axiosInstance.post<{ success: boolean; data: AdTemplate }>(`${BASE}/lead-gen/templates`, payload),

  // ─── Dashboard ─────────────────────────────────────────────────────

  getDashboard: (companyId: string, days = 30) =>
    axiosInstance.get<{ success: boolean; data: DashboardData }>(
      `${BASE}/company/${companyId}/lead-gen/dashboard`,
      { params: { days } },
    ),

  // ─── Creatives ─────────────────────────────────────────────────────

  getCreatives: (companyId: string, params?: { vertical?: string; service_type?: string; ad_type?: string }) =>
    axiosInstance.get<{ success: boolean; data: { creatives: AdCreative[]; total: number } }>(
      `${BASE}/company/${companyId}/lead-gen/creatives`,
      { params },
    ),

  createCreative: (companyId: string, payload: Partial<AdCreative>) =>
    axiosInstance.post<{ success: boolean; data: AdCreative }>(
      `${BASE}/company/${companyId}/lead-gen/creatives`,
      payload,
    ),

  // ─── Optimization Rules ────────────────────────────────────────────

  getRules: (companyId: string) =>
    axiosInstance.get<{ success: boolean; data: { rules: OptimizationRule[]; total: number } }>(
      `${BASE}/company/${companyId}/lead-gen/rules`,
    ),

  createRule: (companyId: string, payload: { name: string; rule_type: string; target_level?: string; params: Record<string, unknown>; is_active?: boolean }) =>
    axiosInstance.post<{ success: boolean; data: OptimizationRule }>(
      `${BASE}/company/${companyId}/lead-gen/rules`,
      payload,
    ),

  updateRule: (companyId: string, ruleId: string, payload: Partial<OptimizationRule>) =>
    axiosInstance.put<{ success: boolean; data: OptimizationRule }>(
      `${BASE}/company/${companyId}/lead-gen/rules/${ruleId}`,
      payload,
    ),

  toggleRuleActive: (companyId: string, ruleId: string, is_active: boolean) =>
    axiosInstance.put<{ success: boolean; data: OptimizationRule }>(
      `${BASE}/company/${companyId}/lead-gen/rules/${ruleId}`,
      { is_active },
    ),

  runRule: (companyId: string, ruleId: string) =>
    axiosInstance.post<{ success: boolean; data: { message: string; actions_taken: number } }>(
      `${BASE}/company/${companyId}/lead-gen/rules/${ruleId}/run`,
    ),

  // ─── Optimization Log ──────────────────────────────────────────────

  getOptimizationLog: (companyId: string, limit = 50, days = 30) =>
    axiosInstance.get<{ success: boolean; data: { logs: OptimizationLog[]; total: number } }>(
      `${BASE}/company/${companyId}/lead-gen/optimization-log`,
      { params: { limit, days } },
    ),

  // ─── Attribution ───────────────────────────────────────────────────

  getAttributions: (
    companyId: string,
    params?: { utm_source?: string; status?: string; days?: number },
  ) =>
    axiosInstance.get<{ success: boolean; data: { attributions: LeadAttribution[]; summary: AttributionSummary } }>(
      `${BASE}/company/${companyId}/lead-gen/attribution`,
      { params },
    ),

  createAttribution: (companyId: string, payload: Record<string, unknown>) =>
    axiosInstance.post<{ success: boolean; data: { id: string } }>(
      `${BASE}/company/${companyId}/lead-gen/attribution`,
      payload,
    ),

  updateAttribution: (companyId: string, attributionId: string, payload: Record<string, unknown>) =>
    axiosInstance.put<{ success: boolean; data: { id: string; attribution_status: string; deal_amount: number | null; roas: number | null } }>(
      `${BASE}/company/${companyId}/lead-gen/attribution/${attributionId}`,
      payload,
    ),

  // ─── Campaign Generation ───────────────────────────────────────────

  generateCampaign: (
    companyId: string,
    payload: {
      template_id: string;
      source_service: 'google_ads' | 'facebook_ads';
      city: string;
      radius_miles: number;
      daily_budget: number;
      target_cpa?: number;
      campaign_name?: string;
    },
  ) =>
    axiosInstance.post<{ success: boolean; data: { campaigns_created: number; campaign_ids: string[]; campaign_names: string[] } }>(
      `${BASE}/company/${companyId}/lead-gen/campaigns/generate`,
      payload,
    ),
};