import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import {
  actualizarPerfil,
  cargarPerfilesSugeridos,
  clonarPerfil,
  crearPerfil,
  eliminarPerfil,
  getArbolModulos,
  listarPerfiles,
  obtenerPerfil,
} from "../api/seguridad.service";

const K = {
  arbol: ["seguridad", "arbol"],
  perfiles: ["seguridad", "perfiles"],
  perfil: (id) => ["seguridad", "perfil", id],
};

export const useArbolModulosQuery = () =>
  useQuery({
    queryKey: K.arbol,
    queryFn: getArbolModulos,
    staleTime: 5 * 60 * 1000,
  });

export const usePerfilesV2Query = () =>
  useQuery({
    queryKey: K.perfiles,
    queryFn: listarPerfiles,
  });

export const usePerfilV2Query = (id) =>
  useQuery({
    queryKey: K.perfil(id),
    queryFn: () => obtenerPerfil(id),
    enabled: !!id,
  });

export const useCrearPerfilMutation = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: crearPerfil,
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: K.perfiles });
      toast.success("Perfil creado");
    },
    onError: (e) =>
      toast.error(e?.response?.data?.message || "No se pudo crear el perfil"),
  });
};

export const useActualizarPerfilMutation = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({ id, ...payload }) => actualizarPerfil(id, payload),
    onSuccess: (_, { id }) => {
      qc.invalidateQueries({ queryKey: K.perfiles });
      qc.invalidateQueries({ queryKey: K.perfil(id) });
      toast.success("Perfil actualizado");
    },
    onError: (e) =>
      toast.error(e?.response?.data?.message || "No se pudo actualizar el perfil"),
  });
};

export const useClonarPerfilMutation = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: clonarPerfil,
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: K.perfiles });
      toast.success("Perfil clonado");
    },
    onError: (e) =>
      toast.error(e?.response?.data?.message || "No se pudo clonar el perfil"),
  });
};

export const useEliminarPerfilMutation = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: eliminarPerfil,
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: K.perfiles });
      toast.success("Perfil eliminado");
    },
    onError: (e) =>
      toast.error(e?.response?.data?.message || "No se pudo eliminar el perfil"),
  });
};

export const useCargarPerfilesSugeridosMutation = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: cargarPerfilesSugeridos,
    onSuccess: (r) => {
      qc.invalidateQueries({ queryKey: K.perfiles });
      toast.success(
        `Perfiles sugeridos: ${r.perfiles_creados} creados, ${r.perfiles_omitidos} ya existían`,
      );
    },
    onError: (e) =>
      toast.error(
        e?.response?.data?.message || "No se pudieron cargar los perfiles sugeridos",
      ),
  });
};
