import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import {
  listPuntosDeVenta,
  getPuntoDeVenta,
  createPuntoDeVenta,
  updatePuntoDeVenta,
  deactivatePuntoDeVenta,
  reactivatePuntoDeVenta,
} from '../api/puntos-de-venta.api'
import type { CreatePuntoDeVentaRequest, PuntosDeVentaQuery, UpdatePuntoDeVentaRequest } from '../types'

export const puntosDeVentaListQueryKey = (query: PuntosDeVentaQuery) =>
  ['puntos-de-venta', 'list', query] as const

export const puntoDeVentaDetailQueryKey = (id: number) =>
  ['puntos-de-venta', 'detail', id] as const

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

export function usePuntosDeVentaList(query: PuntosDeVentaQuery) {
  return useQuery({
    queryKey: puntosDeVentaListQueryKey(query),
    queryFn: () => listPuntosDeVenta(query),
    staleTime: 15_000,
  })
}

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

export function usePuntoDeVenta(id: number) {
  return useQuery({
    queryKey: puntoDeVentaDetailQueryKey(id),
    queryFn: () => getPuntoDeVenta(id),
    enabled: !!id,
    staleTime: 15_000,
  })
}

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

export function useCreatePuntoDeVenta() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (payload: CreatePuntoDeVentaRequest) => createPuntoDeVenta(payload),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['puntos-de-venta'] })
    },
  })
}

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

export function useUpdatePuntoDeVenta(id: number) {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (payload: UpdatePuntoDeVentaRequest) => updatePuntoDeVenta(id, payload),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['puntos-de-venta'] })
    },
  })
}

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

export function useDeactivatePuntoDeVenta() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (id: number) => deactivatePuntoDeVenta(id),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['puntos-de-venta'] })
    },
  })
}

export function useReactivatePuntoDeVenta() {
  const queryClient = useQueryClient()
  return useMutation({
    mutationFn: (id: number) => reactivatePuntoDeVenta(id),
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['puntos-de-venta'] })
    },
  })
}
