import api from './client';

export type ConfigField = {
  name: string;
  label: string;
  type: 'select' | 'text' | 'password';
  options?: string[];
  required: boolean;
};

export type ConnectorDef = {
  service: string;
  name: string;
  category: string;
  description: string;
  auth_type: string;
  auth_fields: string[];
  config_fields?: ConfigField[];
  capabilities: string[];
  rate_limit: string;
  docs_url: string;
};

export type ConnectorRecord = {
  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 ConnectorsListResponse {
  connectors: ConnectorRecord[];
  tier: string;
  connector_limit: number;
  connectors_used: number;
}

export type ConnectorLog = {
  id: string;
  event_type: string;
  status: string;
  record_count: number;
  duration_ms: number | null;
  error_message: string;
  details: Record<string, unknown>;
  created_at: string;
};

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

  list: async (): Promise<ConnectorsListResponse> => {
    const { data } = await api.get('/api/connectors');
    return data;
  },

  update: async (
    connectorId: string,
    updates: Record<string, unknown>,
  ): Promise<{ success: boolean }> => {
    const { data } = await api.put(`/api/connectors/${connectorId}`, updates);
    return data;
  },

  create: async (
    service: string,
    config: Record<string, string>,
    sync_frequency: string = 'hourly',
  ): Promise<{ connector: ConnectorRecord }> => {
    const { data } = await api.post('/api/connectors', {
      service,
      config,
      sync_frequency,
    });
    return data;
  },

  remove: async (connectorId: string): Promise<{ success: boolean }> => {
    const { data } = await api.delete(`/api/connectors/${connectorId}`);
    return data;
  },

  status: async (connectorId: string): Promise<{
    connector_id: string;
    service: string;
    db_status: string;
    live_status: Record<string, unknown>;
  }> => {
    const { data } = await api.get(`/api/connectors/${connectorId}/status`);
    return data;
  },

  sync: async (connectorId: string): Promise<{
    success: boolean;
    status: string;
    record_count: number;
    duration_ms: number;
    last_sync_at: string;
  }> => {
    const { data } = await api.post(`/api/connectors/${connectorId}/sync`);
    return data;
  },

  logs: async (connectorId: string): Promise<{
    connector_id: string;
    logs: ConnectorLog[];
    total: number;
  }> => {
    const { data } = await api.get(`/api/connectors/${connectorId}/logs`);
    return data;
  },

  // -- OAuth 2.0 --

  oauthAuthorize: async (service: string, next?: string): Promise<void> => {
    // Navigate to the OAuth authorize endpoint (redirects to provider)
    const params = next ? `?next=${encodeURIComponent(next)}` : '';
    window.location.href = `/api/connectors/oauth/authorize/${service}${params}`;
  },

  // -- Spreadsheet picker (Google Sheets OAuth) --

  listSpreadsheets: async (): Promise<{
    success: boolean;
    spreadsheets: Array<{
      id: string;
      name: string;
      modifiedTime: string;
      webViewLink: string;
    }>;
    connectorId: string;
  }> => {
    const { data } = await api.get('/api/connectors/oauth/connected-sheets');
    return data;
  },

  selectSpreadsheet: async (spreadsheetId: string): Promise<{
    success: boolean;
    message: string;
    sync_result: Record<string, unknown>;
  }> => {
    const { data } = await api.post('/api/connectors/oauth/connected-sheets/select', {
      spreadsheet_id: spreadsheetId,
    });
    return data;
  },
};

// Re-export SMS/Call API
export * from './smsCall';