/**
 * API client per le impostazioni del tenant.
 *
 * Endpoint:
 *   GET  /api/v1/settings                  -> legge configurazione (admin)
 *   PUT  /api/v1/settings                  -> aggiorna configurazione (admin)
 *   GET  /api/v1/settings/indexing/stats   -> statistiche indicizzazione
 *   GET  /api/v1/settings/indexing/status  -> stato job reindex
 *   POST /api/v1/settings/indexing/reindex -> avvia reindex
 *   DELETE /api/v1/settings/indexing/reindex -> cancella reindex
 */

import { apiClient } from './client'

// ─── Tipi impostazioni generali ────────────────────────────────────────────

export type ArchivalMode = 'mock' | 'production'

export interface TenantSettingsResponse {
  id: string
  tenant_id: string
  archival_mode: ArchivalMode
  conservatore_id: string
  conservatore_endpoint: string | null
  conservatore_username_configured: boolean
  conservatore_password_configured: boolean
  archival_notes: string | null
  created_at: string
  updated_at: string
}

export interface TenantSettingsUpdate {
  archival_mode?: ArchivalMode
  conservatore_id?: string
  /** URL endpoint API del conservatore (obbligatorio in produzione) */
  conservatore_endpoint?: string
  /** Username in chiaro – viene cifrata lato server. Stringa vuota = cancella */
  conservatore_username?: string
  /** Password in chiaro – viene cifrata lato server. Stringa vuota = cancella */
  conservatore_password?: string
  archival_notes?: string
}

// ─── Tipi indicizzazione full-text ─────────────────────────────────────────

export interface IndexingStats {
  total_messages: number
  indexed_messages: number
  unindexed_messages: number
  coverage_pct: number       // 0-100

  attachments_total: number
  attachments_extracted: number
  attachments_pct: number    // 0-100
}

export type ReindexMode = 'full' | 'differential'
export type JobStatus = 'idle' | 'running' | 'completed' | 'failed' | 'cancelled'

export interface IndexingJobStatus {
  status: JobStatus
  mode: ReindexMode | null
  total: number
  processed: number
  progress_pct: number

  started_at: string | null    // ISO datetime
  finished_at: string | null   // ISO datetime
  started_by: string | null    // email
  elapsed_seconds: number | null
  is_stale: boolean            // running da piu' di 2 ore
  error: string | null
}

// ─── Client impostazioni generali ──────────────────────────────────────────

export const settingsApi = {
  /**
   * Recupera le impostazioni del tenant corrente.
   * Se non esistono, il backend le crea con i valori di default (mock).
   */
  get: async (): Promise<TenantSettingsResponse> => {
    const { data } = await apiClient.get<TenantSettingsResponse>('/settings')
    return data
  },

  /**
   * Aggiorna le impostazioni del tenant.
   * Solo i campi forniti vengono modificati (semantica PATCH).
   */
  update: async (payload: TenantSettingsUpdate): Promise<TenantSettingsResponse> => {
    const { data } = await apiClient.put<TenantSettingsResponse>('/settings', payload)
    return data
  },

  // ── Indicizzazione full-text ──────────────────────────────────────────────

  /**
   * Restituisce le statistiche di copertura dell'indicizzazione.
   * @param tenantId - (solo super_admin) UUID del tenant target
   */
  getIndexingStats: async (tenantId?: string): Promise<IndexingStats> => {
    const params = tenantId ? { tenant_id: tenantId } : undefined
    const { data } = await apiClient.get<IndexingStats>('/settings/indexing/stats', { params })
    return data
  },

  /**
   * Restituisce lo stato del job di reindex in corso (o idle se nessuno).
   * @param tenantId - (solo super_admin) UUID del tenant target
   */
  getIndexingStatus: async (tenantId?: string): Promise<IndexingJobStatus> => {
    const params = tenantId ? { tenant_id: tenantId } : undefined
    const { data } = await apiClient.get<IndexingJobStatus>('/settings/indexing/status', { params })
    return data
  },

  /**
   * Avvia un job di reindex in background.
   * @param mode - 'differential' (solo NULL) o 'full' (tutti i messaggi)
   * @param tenantId - (solo super_admin) UUID del tenant target
   */
  startReindex: async (mode: ReindexMode, tenantId?: string): Promise<IndexingJobStatus> => {
    const params = tenantId ? { tenant_id: tenantId } : undefined
    const { data } = await apiClient.post<IndexingJobStatus>(
      '/settings/indexing/reindex',
      { mode },
      { params }
    )
    return data
  },

  /**
   * Cancella il job di reindex in corso.
   * @param tenantId - (solo super_admin) UUID del tenant target
   */
  cancelReindex: async (tenantId?: string): Promise<IndexingJobStatus> => {
    const params = tenantId ? { tenant_id: tenantId } : undefined
    const { data } = await apiClient.delete<IndexingJobStatus>(
      '/settings/indexing/reindex',
      { params }
    )
    return data
  },

  // ── Scansione allegati ────────────────────────────────────────────────────

  /**
   * Restituisce lo stato del job di scansione allegati (idle se nessuno).
   * @param tenantId - (solo super_admin) UUID del tenant target
   */
  getRescanStatus: async (tenantId?: string): Promise<IndexingJobStatus> => {
    const params = tenantId ? { tenant_id: tenantId } : undefined
    const { data } = await apiClient.get<IndexingJobStatus>(
      '/settings/indexing/rescan-status',
      { params }
    )
    return data
  },

  /**
   * Avvia un job di scansione allegati in background.
   * @param force - false: solo allegati senza testo estratto; true: tutti
   * @param tenantId - (solo super_admin) UUID del tenant target
   */
  startRescan: async (force: boolean = false, tenantId?: string): Promise<IndexingJobStatus> => {
    const params = tenantId ? { tenant_id: tenantId } : undefined
    const { data } = await apiClient.post<IndexingJobStatus>(
      '/settings/indexing/rescan',
      { force },
      { params }
    )
    return data
  },

  /**
   * Cancella il job di scansione allegati in corso.
   * @param tenantId - (solo super_admin) UUID del tenant target
   */
  cancelRescan: async (tenantId?: string): Promise<IndexingJobStatus> => {
    const params = tenantId ? { tenant_id: tenantId } : undefined
    const { data } = await apiClient.delete<IndexingJobStatus>(
      '/settings/indexing/rescan',
      { params }
    )
    return data
  },
}
