import api from './client';
// ---------------------------------------------------------------------------
// Types
// ---------------------------------------------------------------------------
export interface MarketOverviewItem {
market: string;
total_deals: number;
won_deals: number;
close_rate: number;
total_revenue: number;
avg_deal_size: number;
active_contacts: number;
}
export interface MarketOverviewResponse {
markets: MarketOverviewItem[];
total_markets: number;
}
export interface MarketComparisonRow {
market: string;
revenue: number;
close_rate: number;
avg_deal_size: number;
deals_per_owner: number;
cpc: number;
total_deals: number;
won_deals: number;
unique_owners: number;
market_share: number;
}
export interface MarketComparisonResponse {
markets: MarketComparisonRow[];
averages: {
revenue: number;
close_rate: number;
avg_deal_size: number;
};
top_performers: MarketComparisonRow[];
bottom_performers: MarketComparisonRow[];
total_markets: number;
}
export interface PipelineStage {
stage: string;
count: number;
value: number;
}
export interface MarketDrillDownSummary {
total_deals: number;
won_deals: number;
lost_deals: number;
active_deals: number;
close_rate: number;
total_revenue: number;
avg_deal_size: number;
total_contacts: number;
active_contacts: number;
}
export interface MarketTopDeal {
id: number;
amount: number;
stage: string;
probability: number | null;
expected_close_date: string | null;
pipeline: string | null;
contact_id: number | null;
}
export interface MarketRecentActivity {
id: number;
stage: string;
amount: number;
created_at: string | null;
}
export interface RevenueTrendPoint {
month: string;
revenue: number;
}
export interface MarketDrillDownResponse {
market: string;
summary: MarketDrillDownSummary;
pipeline_by_stage: PipelineStage[];
top_deals: MarketTopDeal[];
recent_activity: MarketRecentActivity[];
revenue_trend: RevenueTrendPoint[];
}
export interface UnderperformingMetrics {
market: string;
close_rate: number;
total_revenue: number;
avg_deal_size: number;
total_deals: number;
won_deals: number;
recent_revenue: number;
older_revenue: number;
declining: boolean;
}
export interface UnderperformingMarket {
market: string;
issues: string[];
recommendations: string[];
metrics: UnderperformingMetrics;
severity: 'high' | 'medium' | 'low';
}
export interface UnderperformingResponse {
underperforming: UnderperformingMarket[];
total_analyzed: number;
benchmarks: {
avg_close_rate: number;
avg_revenue: number;
};
}
// ---------------------------------------------------------------------------
// API client
// ---------------------------------------------------------------------------
export const multiMarketApi = {
getOverview: async (): Promise<MarketOverviewResponse> => {
const { data } = await api.get('/api/analytics/multi-market/overview');
return data;
},
getComparison: async (): Promise<MarketComparisonResponse> => {
const { data } = await api.get('/api/analytics/multi-market/comparison');
return data;
},
getDrillDown: async (market: string): Promise<MarketDrillDownResponse> => {
const { data } = await api.get(`/api/analytics/multi-market/market/${encodeURIComponent(market)}`);
return data;
},
getUnderperforming: async (): Promise<UnderperformingResponse> => {
const { data } = await api.get('/api/analytics/multi-market/underperforming');
return data;
},
};