const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3011/api';

function getToken(): string | null {
  if (typeof window === 'undefined') return null;
  return localStorage.getItem('crm_token');
}

export function setToken(token: string) {
  localStorage.setItem('crm_token', token);
}

export function clearToken() {
  localStorage.removeItem('crm_token');
}

export function isLoggedIn(): boolean {
  return !!getToken();
}

export async function apiFetch(path: string, options?: RequestInit) {
  const token = getToken();
  const headers: Record<string, string> = {
    'Content-Type': 'application/json',
    ...(options?.headers as Record<string, string> || {}),
  };
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  }

  const res = await fetch(`${API_URL}${path}`, {
    ...options,
    headers,
  });

  if (res.status === 401) {
    clearToken();
    if (typeof window !== 'undefined') {
      window.location.href = '/login';
    }
    throw new Error('Unauthorized');
  }

  if (!res.ok) {
    const body = await res.json().catch(() => ({}));
    throw new Error(body.error || `API error: ${res.status}`);
  }

  return res.json();
}

export const api = {
  // Auth
  login: (username: string, password: string) =>
    apiFetch('/auth/login', { method: 'POST', body: JSON.stringify({ username, password }) }),

  // Dashboard
  dashboard: () => apiFetch('/dashboard'),

  // Contacts
  contacts: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/contacts${qs}`);
  },
  contact: (id: string) => apiFetch(`/contacts/${id}`),
  contactQueries: (id: string, params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/contacts/${id}/queries${qs}`);
  },
  updateContact: (id: string, data: Record<string, any>) =>
    apiFetch(`/contacts/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),

  // Conversations
  conversations: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/conversations${qs}`);
  },
  conversation: (id: string, params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/conversations/${id}${qs}`);
  },

  // Messages
  searchMessages: (params: Record<string, string>) => {
    const qs = '?' + new URLSearchParams(params).toString();
    return apiFetch(`/messages/search${qs}`);
  },

  // Analytics
  analyticsOverview: (days?: number) =>
    apiFetch(`/analytics/overview${days ? `?days=${days}` : ''}`),
  analyticsAgents: () => apiFetch('/analytics/agents'),

  // Sync
  syncStatus: () => apiFetch('/sync/status'),
  syncTrigger: (agent?: string, full?: boolean) =>
    apiFetch('/sync/trigger', { method: 'POST', body: JSON.stringify({ agent, full }) }),

  // Live Queries
  queriesLive: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/queries/live${qs}`);
  },
  queryResponse: (id: string) => apiFetch(`/queries/${id}/response`),

  // Cha-Ching
  chachingSummary: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/chaching/summary${qs}`);
  },

  // Agents
  agents: () => apiFetch('/agents'),
  agent: (name: string) => apiFetch(`/agents/${encodeURIComponent(name)}`),
  agentAction: (name: string, action: 'restart' | 'stop' | 'start') =>
    apiFetch(`/agents/${encodeURIComponent(name)}/${action}`, { method: 'POST' }),
  agentLogs: (name: string, lines?: number) =>
    apiFetch(`/agents/${encodeURIComponent(name)}/logs${lines ? `?lines=${lines}` : ''}`),
  agentSettings: (name: string) =>
    apiFetch(`/agents/${encodeURIComponent(name)}/settings`),
  updateAgentSettings: (name: string, settings: { key: string; value: string }[], restart?: boolean) =>
    apiFetch(`/agents/${encodeURIComponent(name)}/settings`, {
      method: 'PUT',
      body: JSON.stringify({ settings, restart }),
    }),

  // ── Marketing / Broadcasts ──
  mktBuckets: () => apiFetch('/marketing/buckets'),
  mktBucket: (id: string) => apiFetch(`/marketing/buckets/${id}`),
  mktCreateBucket: (data: Record<string, any>) =>
    apiFetch('/marketing/buckets', { method: 'POST', body: JSON.stringify(data) }),
  mktUpdateBucket: (id: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),

  mktPillars: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/pillars`),
  mktCreatePillar: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/pillars`, { method: 'POST', body: JSON.stringify(data) }),
  mktUpdatePillar: (id: string, data: Record<string, any>) =>
    apiFetch(`/marketing/pillars/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),
  mktDeletePillar: (id: string) =>
    apiFetch(`/marketing/pillars/${id}`, { method: 'DELETE' }),

  mktFormats: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/formats`),
  mktCreateFormat: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/formats`, { method: 'POST', body: JSON.stringify(data) }),

  mktCtas: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/ctas`),
  mktCreateCta: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/ctas`, { method: 'POST', body: JSON.stringify(data) }),

  mktAssets: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/assets`),
  mktCreateAsset: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/assets`, { method: 'POST', body: JSON.stringify(data) }),

  mktCampaigns: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/campaigns`),
  mktCreateCampaign: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/campaigns`, { method: 'POST', body: JSON.stringify(data) }),
  mktUpdateCampaign: (id: string, data: Record<string, any>) =>
    apiFetch(`/marketing/campaigns/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),

  mktSchedule: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/schedule`),
  mktCreateSlot: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/schedule`, { method: 'POST', body: JSON.stringify(data) }),
  mktUpdateSlot: (id: string, data: Record<string, any>) =>
    apiFetch(`/marketing/schedule/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),
  mktDeleteSlot: (id: string) =>
    apiFetch(`/marketing/schedule/${id}`, { method: 'DELETE' }),

  mktDrafts: (bucketId: string, params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/marketing/buckets/${bucketId}/drafts${qs}`);
  },
  mktCreateDraft: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/drafts`, { method: 'POST', body: JSON.stringify(data) }),
  mktUpdateDraft: (id: string, data: Record<string, any>) =>
    apiFetch(`/marketing/drafts/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),
  mktRevisions: (draftId: string) => apiFetch(`/marketing/drafts/${draftId}/revisions`),

  mktEngagementRules: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/engagement-rules`),
  mktCreateEngagementRule: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/engagement-rules`, { method: 'POST', body: JSON.stringify(data) }),
  mktUpdateEngagementRule: (id: string, data: Record<string, any>) =>
    apiFetch(`/marketing/engagement-rules/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),

  mktLeads: (bucketId: string) => apiFetch(`/marketing/buckets/${bucketId}/leads`),
  mktCreateLead: (bucketId: string, data: Record<string, any>) =>
    apiFetch(`/marketing/buckets/${bucketId}/leads`, { method: 'POST', body: JSON.stringify(data) }),
  mktUpdateLead: (id: string, data: Record<string, any>) =>
    apiFetch(`/marketing/leads/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),

  // Claw Visibility (X bucket agent data)
  clawTweets: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/marketing/claw/tweets${qs}`);
  },
  clawTweetStats: (days?: number) =>
    apiFetch(`/marketing/claw/tweet-stats${days ? `?days=${days}` : ''}`),
  clawEngagement: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/marketing/claw/engagement${qs}`);
  },
  clawPicks: () => apiFetch('/marketing/claw/picks'),
  clawWorkerRuns: (limit?: number) =>
    apiFetch(`/marketing/claw/worker-runs${limit ? `?limit=${limit}` : ''}`),

  // ── Rainmaker Users ──
  rainmakerUsers: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/rainmaker/users${qs}`);
  },
  rainmakerUser: (userId: string) => apiFetch(`/rainmaker/users/${userId}`),

  // ── Orb Agents ──
  orbAgents: () => apiFetch('/rainmaker/orb-agents'),
  orbAgentDetail: (id: string) => apiFetch(`/rainmaker/orb-agents/${id}`),
  orbProjects: () => apiFetch('/rainmaker/orb-agents/projects'),

  // ── Archives ──
  archivesDashboard: () => apiFetch('/archives/dashboard'),
  archivesList: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/archives/list${qs}`);
  },
  archiveDetail: (id: string) => apiFetch(`/archives/${id}`),
  archiveBlogs: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/archives/blogs/list${qs}`);
  },
  archiveBlogUpdate: (id: string, data: Record<string, any>) =>
    apiFetch(`/archives/blogs/${id}`, { method: 'PATCH', body: JSON.stringify(data) }),

  // ── Learning 101 ──
  learningProgress: () => apiFetch('/learning/progress'),
  learningQuestions: () => apiFetch('/learning/questions'),
  learningNotes: (module: string) => apiFetch(`/learning/notes/${module}`),
  learningAvailableNotes: () => apiFetch('/learning/available-notes'),

  // ── The Pool (Cache + Backtesting) ──
  poolStats: () => apiFetch('/cache/stats'),
  poolEntries: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/cache/entries${qs}`);
  },
  poolTopQueries: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/cache/top-queries${qs}`);
  },
  poolEvents: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/cache/events${qs}`);
  },
  poolDaily: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/cache/daily${qs}`);
  },
  poolSavings: () => apiFetch('/cache/savings'),
  poolAbStats: () => apiFetch('/cache/ab-stats'),
  poolEntryResponse: (id: string) => apiFetch(`/cache/entry/${id}/response`),
  poolEvict: (id: string) =>
    apiFetch(`/cache/entry/${id}`, { method: 'DELETE' }),
  poolWarm: () =>
    apiFetch('/cache/warm', { method: 'POST' }),
  poolBacktests: () => apiFetch('/pool/backtests'),
  poolBacktest: (id: string) => apiFetch(`/pool/backtests/${id}`),
  poolCreateBacktest: (data: Record<string, any>) =>
    apiFetch('/pool/backtests', { method: 'POST', body: JSON.stringify(data) }),
  poolDeleteBacktest: (id: string) =>
    apiFetch(`/pool/backtests/${id}`, { method: 'DELETE' }),

  // ── Compliance Guard ──
  complianceScans: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/compliance/scans${qs}`);
  },
  complianceScanDetail: (id: string) => apiFetch(`/compliance/scans/${id}`),
  complianceScan: (data: Record<string, any>) =>
    apiFetch('/compliance/scan', { method: 'POST', body: JSON.stringify(data) }),
  complianceApply: (scanId: string, applyMode: string) =>
    apiFetch('/compliance/apply', { method: 'POST', body: JSON.stringify({ scanId, applyMode }) }),
  complianceReview: (scanId: string, notes: string, action?: string) =>
    apiFetch('/compliance/review', { method: 'POST', body: JSON.stringify({ scanId, reviewedBy: 'admin', notes, action }) }),
  compliancePolicies: () => apiFetch('/compliance/policies'),
  complianceActivePolicy: () => apiFetch('/compliance/policies/active'),
  complianceCreatePolicy: (data: Record<string, any>) =>
    apiFetch('/compliance/policies', { method: 'POST', body: JSON.stringify(data) }),
  complianceActivatePolicy: (version: number) =>
    apiFetch(`/compliance/policies/${version}/activate`, { method: 'POST' }),
  complianceAnalytics: (days?: number) =>
    apiFetch(`/compliance/analytics${days ? `?days=${days}` : ''}`),

  // ── Conversions ──
  conversions: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/conversions${qs}`);
  },
  intelList: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/conversions/intel${qs}`);
  },
  intelDetail: (id: string) => apiFetch(`/conversions/intel/${id}`),
  surveyInsights: () => apiFetch('/conversions/surveys'),

  // ── Site Traffic ──
  trafficOverview: (params?: Record<string, string>) => {
    const qs = params ? '?' + new URLSearchParams(params).toString() : '';
    return apiFetch(`/traffic/overview${qs}`);
  },

  // ── API Usage ──
  apiUsageSummary: (days?: number) => apiFetch(`/api-usage/summary${days ? `?days=${days}` : ''}`),
  apiUsagePeriod: (period: string, days?: number) => {
    const qs = new URLSearchParams({ period });
    if (days) qs.set('days', String(days));
    return apiFetch(`/api-usage/period?${qs}`);
  },
  apiUsageForecastPerformance: (days?: number) => apiFetch(`/api-usage/forecast-performance${days ? `?days=${days}` : ''}`),
  apiUsageBatchSummary: (days?: number) => apiFetch(`/api-usage/batch-summary${days ? `?days=${days}` : ''}`),
  apiUsageErrors: (days?: number) => apiFetch(`/api-usage/errors${days ? `?days=${days}` : ''}`),
  apiUsageModelPricing: () => apiFetch('/api-usage/model-pricing'),
  apiUsageExportUrl: (type: string, days: number) => `${API_URL}/api-usage/export?type=${type}&days=${days}`,
};
