import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import {
    createUsuario,
    getPerfilesEmpresa,
    getUsuario,
    getUsuarios,
    toggleUsuarioStatus,
    updateUsuario,
} from "../api/usuarios.service";
import { useUsuariosStore } from "../store/UsuariosStore";

// Hook para editar perfil del usuario actual usando la nueva API
export const useEditarPerfilMutation = () => {
  const queryClient = useQueryClient();
  const { datausuarios } = useUsuariosStore();

  return useMutation({
    mutationKey: ["editar perfil"],
    mutationFn: async (data) => {
      const payload = {
        nombres: data.nombres,
        apellidos: data.apellidos,
        username: data.username,
        email: data.email,
      };

      // Solo incluir password si se proporcionó
      if (data.password && data.password.trim() !== "") {
        payload.password = data.password;
      }

      return updateUsuario(datausuarios?.id, payload);
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al editar perfil");
    },
    onSuccess: () => {
      toast.success("Perfil actualizado correctamente");
      queryClient.invalidateQueries({ queryKey: ["usuarios"] });
    },
  });
};

// Query para listar usuarios
export const useUsuariosQuery = (empresaId, page = 1, limit = 100) => {
  return useQuery({
    queryKey: ["usuarios", empresaId, page, limit],
    queryFn: () => getUsuarios(page, limit, empresaId),
    enabled: !!empresaId,
  });
};

// Query para obtener un usuario por ID
export const useUsuarioQuery = (userId) => {
  return useQuery({
    queryKey: ["usuario", userId],
    queryFn: () => getUsuario(userId),
    enabled: !!userId,
  });
};

// Query para obtener perfiles disponibles del empresa actual.
// Usa el mismo endpoint y queryKey que PerfilesStack para que el cache se
// mantenga consistente cuando se clonan / crean / editan perfiles.
export const usePerfilesQuery = () => {
  return useQuery({
    queryKey: ["perfiles"],
    queryFn: getPerfilesEmpresa,
    staleTime: 1000 * 60 * 5,
  });
};

// Mutation para crear usuario
export const useCreateUsuarioMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: createUsuario,
    onSuccess: () => {
      toast.success("Usuario creado correctamente");
      queryClient.invalidateQueries({ queryKey: ["usuarios"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al crear usuario");
    },
  });
};

// Mutation para actualizar usuario
export const useUpdateUsuarioMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: ({ id, data }) => updateUsuario(id, data),
    onSuccess: () => {
      toast.success("Usuario actualizado correctamente");
      queryClient.invalidateQueries({ queryKey: ["usuarios"] });
    },
    onError: (error) => {
      toast.error(
        error.response?.data?.message || "Error al actualizar usuario",
      );
    },
  });
};

// Mutation para toggle estado
export const useToggleUsuarioMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: toggleUsuarioStatus,
    onSuccess: () => {
      toast.success("Estado de usuario actualizado");
      queryClient.invalidateQueries({ queryKey: ["usuarios"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al cambiar estado");
    },
  });
};
