// ADM-009 — TanStack Query hooks para fiscal/iibb
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import {
  listIngresosBrutos,
  getIngresosBrutosById,
  getHistorialIngresosBrutos,
  createIngresosBrutos,
  updateIngresosBrutos,
  nuevaVersionIngresosBrutos,
  deactivateIngresosBrutos,
  reactivateIngresosBrutos,
} from '../api/iibbApi'
import type {
  IngresosBrutosFilter,
  CreateIngresosBrutosRequest,
  UpdateIngresosBrutosRequest,
  NuevaVersionIngresosBrutosRequest,
} from '../types/ingresosBrutos.types'

// ─── Query keys estables ──────────────────────────────────────────────────────

export const iibbListQueryKey = (filters: IngresosBrutosFilter) =>
  ['fiscal', 'iibb', 'list', filters] as const

export const iibbDetailQueryKey = (id: number) =>
  ['fiscal', 'iibb', id] as const

export const iibbHistorialQueryKey = (id: number) =>
  ['fiscal', 'iibb', id, 'historial'] as const

// ─── List ─────────────────────────────────────────────────────────────────────

export function useIngresosBrutosList(filters: IngresosBrutosFilter) {
  return useQuery({
    queryKey: iibbListQueryKey(filters),
    queryFn: () => listIngresosBrutos(filters),
    staleTime: 15_000,
  })
}

// ─── Detail ──────────────────────────────────────────────────────────────────

export function useIngresosBrutos(id: number | null) {
  return useQuery({
    queryKey: iibbDetailQueryKey(id ?? 0),
    queryFn: () => getIngresosBrutosById(id!),
    enabled: id != null,
    staleTime: 15_000,
  })
}

// ─── Historial (lazy — solo cuando el tooltip está abierto) ───────────────────

export function useHistorialIngresosBrutos(id: number | null, enabled = false) {
  return useQuery({
    queryKey: iibbHistorialQueryKey(id ?? 0),
    queryFn: () => getHistorialIngresosBrutos(id!),
    enabled: id != null && enabled,
    staleTime: 15_000,
  })
}

// ─── Create ──────────────────────────────────────────────────────────────────

export function useCreateIngresosBrutos() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (payload: CreateIngresosBrutosRequest) => createIngresosBrutos(payload),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['fiscal', 'iibb'] })
    },
  })
}

// ─── Update ──────────────────────────────────────────────────────────────────

export function useUpdateIngresosBrutos() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: ({ id, body }: { id: number; body: UpdateIngresosBrutosRequest }) =>
      updateIngresosBrutos(id, body),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['fiscal', 'iibb'] })
    },
  })
}

// ─── Nueva versión ───────────────────────────────────────────────────────────

export function useNuevaVersionIngresosBrutos() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: ({ id, body }: { id: number; body: NuevaVersionIngresosBrutosRequest }) =>
      nuevaVersionIngresosBrutos(id, body),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['fiscal', 'iibb'] })
    },
  })
}

// ─── Deactivate / Reactivate ─────────────────────────────────────────────────

export function useDeactivateIngresosBrutos() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (id: number) => deactivateIngresosBrutos(id),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['fiscal', 'iibb'] })
    },
  })
}

export function useReactivateIngresosBrutos() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (id: number) => reactivateIngresosBrutos(id),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['fiscal', 'iibb'] })
    },
  })
}
