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,
),
};