import api from './client';
import type {
  DashboardStats,
  AnalyticsData,
  AuditLog,
  ApiUser,
  PaginatedResponse,
  Organization,
  Lead,
  User,
  PlatformRole,
  CompanyRole,
  Portfolio,
  EmailCampaign,
  EmailDeliveryLog,
} from '../types';

export interface ProxyConnectorRecord {
  id: string;
  service: string;
  serviceDisplayName?: string;
  status: string;
  auth_type?: string;
  sync_frequency: string;
  last_sync_at: string | null;
  error_message: string;
  created_at: string | null;
  contacts_count?: number;
  deals_count?: number;
  sync_count?: number;
}

export interface ProxyConnectorDef {
  service: string;
  name: string;
  category: string;
  description: string;
  auth_type: string;
  auth_fields: string[];
  config_fields?: Array<{
    name: string;
    label: string;
    type: 'select' | 'text' | 'password';
    options?: string[];
    required: boolean;
  }>;
  capabilities: string[];
  rate_limit: string;
  docs_url: string;
}

// ─── Super-admin proxy helpers (manage any company's integrations) ─────────

export const proxyApi = {
  // Connectors

  listConnectors: async (companyId: string): Promise<{ connectors: ProxyConnectorRecord[] }> => {
    const { data } = await api.get(`/api/super-admin/company/${companyId}/connectors`);
    // Proxy returns {success, data: [...]} — normalize to {connectors: [...]}
    return { connectors: data?.data || [] };
  },

  availableConnectors: async (): Promise<{ connectors: ProxyConnectorDef[] }> => {
    const { data } = await api.get('/api/connectors/available');
    return data;
  },

  connectorStatus: async (companyId: string, connectorId: string): Promise<any> => {
    const { data } = await api.get(`/api/super-admin/company/${companyId}/connectors/${connectorId}/status`);
    return data;
  },

  syncConnector: async (companyId: string, connectorId: string): Promise<any> => {
    const { data } = await api.post(`/api/super-admin/company/${companyId}/connectors/${connectorId}/sync`);
    return data;
  },

  refreshConnector: async (companyId: string, connectorId: string): Promise<any> => {
    const { data } = await api.post(`/api/super-admin/company/${companyId}/connectors/${connectorId}/refresh`);
    return data;
  },

  connectorLogs: async (companyId: string, connectorId: string): Promise<any> => {
    const { data } = await api.get(`/api/super-admin/company/${companyId}/connectors/${connectorId}/logs`);
    return data;
  },

  disconnectConnector: async (companyId: string, connectorId: string): Promise<any> => {
    const { data } = await api.post(`/api/super-admin/company/${companyId}/connectors/${connectorId}/disconnect`);
    return data;
  },

  updateConnector: async (companyId: string, connectorId: string, updates: Record<string, unknown>): Promise<any> => {
    const { data } = await api.put(`/api/super-admin/company/${companyId}/connectors/${connectorId}`, updates);
    return data;
  },

  createConnector: async (companyId: string, service: string, config: Record<string, string>, sync_frequency: string = 'hourly'): Promise<any> => {
    const { data } = await api.post(`/api/super-admin/company/${companyId}/connectors`, { service, config, sync_frequency });
    return data;
  },

  // Billing

  getSubscription: async (companyId: string): Promise<any> => {
    const { data } = await api.get(`/api/super-admin/company/${companyId}/billing/subscription`);
    return data;
  },

  // Company overview

  companyOverview: async (companyId: string): Promise<any> => {
    const { data } = await api.get(`/api/super-admin/company/${companyId}/overview`);
    return data;
  },
};

export const adminApi = {
  getOverview: async (): Promise<DashboardStats> => {
    const { data } = await api.get<DashboardStats>('/api/super-admin/overview');
    return data;
  },

  getAnalytics: async (): Promise<AnalyticsData> => {
    const { data } = await api.get<AnalyticsData>('/api/super-admin/analytics');
    return data;
  },

  getOrganizations: async (): Promise<PaginatedResponse<Organization>> => {
    const { data } = await api.get<PaginatedResponse<Organization>>('/api/super-admin/organizations');
    return data;
  },

  createOrganization: async (data: {
    name: string;
    industry?: string;
    annual_revenue?: number;
    address?: string;
    city?: string;
    state?: string;
    postal_code?: string;
    country?: string;
    phone?: string;
    website?: string;
    owner_id?: string;
    stripe_customer_id?: string;
  }): Promise<{ success: boolean; organization: { id: string; name: string } }> => {
    const { data: result } = await api.post<{ success: boolean; organization: { id: string; name: string } }>('/api/super-admin/organizations', data);
    return result;
  },

  deleteOrganization: async (orgId: string): Promise<{ success: boolean; message: string }> => {
    const { data } = await api.delete<{ success: boolean; message: string }>(`/api/super-admin/organizations/${orgId}`);
    return data;
  },

  getUsers: async (params?: {
    limit?: number;
    role?: string;
  }): Promise<PaginatedResponse<ApiUser>> => {
    const { data } = await api.get<PaginatedResponse<ApiUser>>('/api/super-admin/users', { params });
    return data;
  },

  createUser: async (data: {
    email: string;
    full_name?: string;
    password: string;
    role?: PlatformRole;
    company_name?: string;
    company_role?: CompanyRole;
  }): Promise<{ success: boolean; user: ApiUser }> => {
    const { data: result } = await api.post<{ success: boolean; user: ApiUser }>('/api/super-admin/users', data);
    return result;
  },

  deleteUser: async (userId: number): Promise<{ success: boolean; message: string }> => {
    const { data } = await api.delete<{ success: boolean; message: string }>(`/api/super-admin/users/${userId}`);
    return data;
  },

  updateUserRole: async (userId: number, role: PlatformRole): Promise<User> => {
    const { data } = await api.put<{ user: User }>(`/api/super-admin/users/${userId}/role`, { role });
    return data.user;
  },

  updateCompanyRole: async (userId: number, role: CompanyRole, companyId?: number): Promise<{ id: number; email: string; full_name: string; role: string; companyRole: CompanyRole; companyId?: number }> => {
    const body: Record<string, unknown> = { role };
    if (companyId) body.company_id = companyId;
    const { data } = await api.put<{ user: { id: number; email: string; full_name: string; role: string; companyRole: CompanyRole; companyId?: number; created?: boolean } }>(`/api/super-admin/users/${userId}/company-role`, body);
    return data.user;
  },

  updateUser: async (
    userId: number,
    data: { full_name?: string; email?: string; role?: PlatformRole; is_active?: boolean },
  ): Promise<User> => {
    const { data: result } = await api.put<{ user: User }>(`/api/super-admin/users/${userId}`, data);
    return result.user;
  },

  getAuditLogs: async (params?: {
    limit?: number;
    entityType?: string;
    actorEmail?: string;
  }): Promise<PaginatedResponse<AuditLog>> => {
    const { data } = await api.get<PaginatedResponse<AuditLog>>('/api/super-admin/audit', { params });
    return data;
  },

  getGroups: async (): Promise<PaginatedResponse<unknown>> => {
    const { data } = await api.get('/api/super-admin/groups');
    return data;
  },

  getLeads: async (): Promise<PaginatedResponse<Lead>> => {
    const { data } = await api.get<PaginatedResponse<Lead>>('/api/super-admin/leads');
    return data;
  },

  getLeadRecipients: async (): Promise<{
    items: { id: string; name: string; email: string; type: string }[];
  }> => {
    const { data } = await api.get('/api/super-admin/lead-recipients');
    return data;
  },

  getEmailFailures: async (status?: string): Promise<PaginatedResponse<unknown>> => {
    const { data } = await api.get('/api/super-admin/email-failures', { params: { status } });
    return data;
  },

  // Portfolios
  getPortfolios: async (): Promise<{ items: Portfolio[]; total: number }> => {
    const { data } = await api.get('/api/portfolios/');
    return data;
  },

  getPortfolio: async (id: string): Promise<{ portfolio: Portfolio }> => {
    const { data } = await api.get(`/api/portfolios/${id}`);
    return data;
  },

  createPortfolio: async (data: { name: string; description?: string; company_ids?: string[] }): Promise<{ portfolio: Portfolio }> => {
    const { data: result } = await api.post('/api/portfolios/', data);
    return result;
  },

  updatePortfolio: async (id: string, data: { name?: string; description?: string }): Promise<{ portfolio: Portfolio }> => {
    const { data: result } = await api.put(`/api/portfolios/${id}`, data);
    return result;
  },

  deletePortfolio: async (id: string): Promise<{ message: string }> => {
    const { data } = await api.delete(`/api/portfolios/${id}`);
    return data;
  },

  addPortfolioCompanies: async (id: string, company_ids: string[]): Promise<{ portfolio: Portfolio; added: string[] }> => {
    const { data } = await api.post(`/api/portfolios/${id}/companies`, { company_ids });
    return data;
  },

  removePortfolioCompanies: async (id: string, company_ids: string[]): Promise<{ portfolio: Portfolio; removed: string[] }> => {
    const { data } = await api.delete(`/api/portfolios/${id}/companies`, { data: { company_ids } });
    return data;
  },

  // Email Campaigns
  getEmailCampaigns: async (): Promise<{ items: EmailCampaign[]; total: number }> => {
    const { data } = await api.get('/api/email-campaigns/');
    return data;
  },

  getEmailCampaign: async (id: string): Promise<{ campaign: EmailCampaign; logs: EmailDeliveryLog[] }> => {
    const { data } = await api.get(`/api/email-campaigns/${id}`);
    return data;
  },

  createEmailCampaign: async (data: {
    name: string;
    status?: string;
    subject?: string;
    body?: string;
    recipients?: { email: string }[];
  }): Promise<{ campaign: EmailCampaign }> => {
    const { data: result } = await api.post('/api/email-campaigns/', data);
    return result;
  },

  updateEmailCampaign: async (id: string, data: {
    status?: string;
    subject?: string;
    body?: string;
    total_sent?: number;
    delivered?: number;
    opened?: number;
    bounced?: number;
    failed?: number;
  }): Promise<{ campaign: EmailCampaign }> => {
    const { data: result } = await api.put(`/api/email-campaigns/${id}`, data);
    return result;
  },

  deleteEmailCampaign: async (id: string): Promise<{ message: string }> => {
    const { data } = await api.delete(`/api/email-campaigns/${id}`);
    return data;
  },

  // Partners
  getPartners: async (): Promise<{ partners: unknown[] }> => {
    const { data } = await api.get('/api/super-admin/partners');
    return data;
  },

  createPartner: async (name: string): Promise<{ partner: unknown }> => {
    const { data } = await api.post('/api/super-admin/partners', { name });
    return data;
  },
};
