/**
 * Generic entity history composable.
 *
 * Replaces useComponentHistory, usePieceHistory, useProductHistory which were
 * 99% identical (only the API endpoint differed).
 */

import { ref } from 'vue'
import { useApi } from '~/composables/useApi'

export type EntityHistoryActor = {
  id: string
  label: string
}

export type EntityHistoryEntry = {
  id: string
  action: 'create' | 'update' | 'delete' | string
  createdAt: string
  actor: EntityHistoryActor | null
  diff: Record<string, { from: unknown; to: unknown }> | null
  snapshot: Record<string, unknown> | null
}

const ENTITY_ENDPOINTS: Record<string, string> = {
  machine: '/machines',
  composant: '/composants',
  piece: '/pieces',
  product: '/products',
}

const extractItems = (payload: any): EntityHistoryEntry[] => {
  if (Array.isArray(payload?.items)) return payload.items
  if (Array.isArray(payload?.member)) return payload.member
  if (Array.isArray(payload?.['hydra:member'])) return payload['hydra:member']
  return []
}

export function useEntityHistory(entityType: 'machine' | 'composant' | 'piece' | 'product') {
  const { get } = useApi()
  const basePath = ENTITY_ENDPOINTS[entityType]

  const history = ref<EntityHistoryEntry[]>([])
  const loading = ref(false)
  const error = ref<string | null>(null)

  const loadHistory = async (entityId: string) => {
    loading.value = true
    error.value = null
    try {
      const result = await get(`${basePath}/${entityId}/history`)
      if (!result.success) {
        error.value = result.error ?? 'Impossible de charger l\'historique.'
        history.value = []
        return result
      }
      history.value = extractItems(result.data)
      return { success: true, data: history.value }
    } catch (err: any) {
      const message = err?.message ?? 'Erreur inconnue'
      error.value = message
      history.value = []
      return { success: false, error: message }
    } finally {
      loading.value = false
    }
  }

  return { history, loading, error, loadHistory }
}
