import api from './client';

// ─── 2FA ───────────────────────────────────────────────────────────────

export interface TwoFactorStatus {
  enabled: boolean;
  totp_enabled: boolean;
}

export interface TwoFactorSetupResponse {
  secret: string;
  qr_url: string;
  otpauth_url: string;
  user_email: string;
}

// ─── API Keys ──────────────────────────────────────────────────────────

export interface ApiKey {
  id: string;
  name: string;
  masked_key: string;
  key?: string;  // Only present on creation
  last_used_at: string | null;
  created_at: string | null;
  expires_at: string | null;
  permissions: Record<string, boolean>;
}

export interface CreateApiKeyRequest {
  name: string;
  permissions?: Record<string, boolean>;
}

// ─── Connected Accounts ────────────────────────────────────────────────

export interface ConnectedAccount {
  service: string;
  display_name: string;
  status: 'connected' | 'error' | 'inactive' | 'syncing';
  connected_at: string | null;
  last_sync: string | null;
  icon: string;
  providerUrl: string;
}

export const securityApi = {
  // ─── 2FA ───────────────────────────────────────────────────────────
  get2faStatus: async (): Promise<TwoFactorStatus> => {
    const { data } = await api.get<TwoFactorStatus>('/api/security/2fa/status');
    return data;
  },

  setup2fa: async (): Promise<TwoFactorSetupResponse> => {
    const { data } = await api.post<TwoFactorSetupResponse>('/api/security/2fa/setup');
    return data;
  },

  enable2fa: async (code: string, secret: string): Promise<{ success: boolean; message: string }> => {
    const { data } = await api.post<{ success: boolean; message: string }>('/api/security/2fa/enable', {
      code,
      secret,
    });
    return data;
  },

  disable2fa: async (currentPassword: string): Promise<{ success: boolean; message: string }> => {
    const { data } = await api.post<{ success: boolean; message: string }>('/api/security/2fa/disable', {
      currentPassword,
    });
    return data;
  },

  // ─── API Keys ──────────────────────────────────────────────────────
  listApiKeys: async (): Promise<ApiKey[]> => {
    const { data } = await api.get<{ success: boolean; data: ApiKey[] }>('/api/security/api-keys');
    return data.data;
  },

  createApiKey: async (request: CreateApiKeyRequest): Promise<ApiKey> => {
    const { data } = await api.post<{ success: boolean; data: ApiKey }>('/api/security/api-keys', request);
    return data.data;
  },

  updateApiKey: async (id: string, name: string): Promise<{ id: string; name: string }> => {
    const { data } = await api.put<{ success: boolean; data: { id: string; name: string } }>(
      `/api/security/api-keys/${id}`,
      { name },
    );
    return data.data;
  },

  revokeApiKey: async (id: string): Promise<{ success: boolean; message: string }> => {
    const { data } = await api.delete<{ success: boolean; message: string }>(
      `/api/security/api-keys/${id}`,
    );
    return data;
  },

  // ─── Connected Accounts ────────────────────────────────────────────
  getConnectedAccounts: async (): Promise<ConnectedAccount[]> => {
    const { data } = await api.get<{ success: boolean; data: ConnectedAccount[] }>(
      '/api/security/connected-accounts',
    );
    return data.data;
  },

  disconnectAccount: async (service: string): Promise<{ success: boolean; message: string }> => {
    const { data } = await api.post<{ success: boolean; message: string }>(
      `/api/security/connected-accounts/${service}/disconnect`,
    );
    return data;
  },

  // ─── Active Sessions ───────────────────────────────────────────────
  getSessions: async (): Promise<{ success: boolean; data: any[] }> => {
    const { data } = await api.get<{ success: boolean; data: any[] }>('/api/security/sessions');
    return data;
  },

  revokeSession: async (sessionId: string): Promise<{ success: boolean; message: string }> => {
    const { data } = await api.post<{ success: boolean; message: string }>(
      `/api/security/sessions/${sessionId}/revoke`,
    );
    return data;
  },

  revokeOtherSessions: async (): Promise<{ success: boolean; message: string; count: number }> => {
    const { data } = await api.post<{ success: boolean; message: string; count: number }>(
      '/api/security/sessions/revoke-other',
    );
    return data;
  },

  // ─── Login History ─────────────────────────────────────────────────
  getLoginHistory: async (): Promise<{ success: boolean; data: any[] }> => {
    const { data } = await api.get<{ success: boolean; data: any[] }>('/api/security/login-history');
    return data;
  },
};