import { ref } from "vue";
import type { ApiResponse } from "~/types/ApiResponse";
import { useClienteStore } from "~/store/cliente";
import { useUserStore } from "~/store/user";
import type { DatosIniciales, Cliente, Opts } from "~/types/Cliente";

export const useCliente = () => {
  const toast = useToast();
  const loading = ref(false);
  const error = ref<string | null>(null);
  const clienteStore = useClienteStore();
  const userStore = useUserStore();
  const clientes = ref<Cliente[]>([]);

  const role = userStore.role?.toLowerCase()
  // Actualizar Cliente
  const actualizarDatosPedido = async (payload: any) => {
    try {
      loading.value = true;
      error.value = null;
      const body = {
        action: "update",
        ...payload,
      };

      const { data, success, message } = await useApiFetch<any>(
        `${role}/cliente`,
        {
          method: "POST",
          body,
        }
      );

      if (!success) {
        throw new Error(message || "Error al actualizar los datos del cliente");
      }

      const clienteActual = clienteStore.cliente;
      if (clienteActual) {
        const tipoClienteSeleccionado = clienteStore.tipo_clientes?.find((t: any) => t.id == payload.tipo_cliente_id) || clienteActual.tipo_cliente || { nombre: "" };
        const tipoNegocioSeleccionado = clienteStore.tipo_negocios?.find((t: any) => t.id == payload.tipo_negocio_id) || clienteActual.tipo_negocio || { nombre: "" };

        const clienteActualizado = {
          ...clienteActual,
          ...payload,
          tipo_cliente: tipoClienteSeleccionado,
          tipo_negocio: tipoNegocioSeleccionado
        };
        clienteStore.setCliente(clienteActualizado);
      }

      return { success, message: "Datos actualizados correctamente" };
    } catch (err: any) {
      error.value = err instanceof Error ? err.message : "Error al actualizar";
      throw err;
    } finally {
      loading.value = false;
    }
  };

  // Datos iniciales para el formulario de cliente - store/update
  const datosIniciales = async () => {
    try {
      userStore.globalLoading = true;
      const { data, success, message } = await useApiFetch<DatosIniciales>(
        `${role}/cliente`,
        {
          method: "POST",
          body: {
            action: "datos_iniciales",
          },
        },
      );
      if (success) {
        clienteStore.departamentos = data.departamentos;
        clienteStore.tipo_clientes = data.tipo_clientes;
        clienteStore.tipo_negocios = data.tipo_negocios;
      }
    } catch (err) {
      console.error("Error fetching user info:", err);
    } finally {
      userStore.globalLoading = false;
    }
  }

  // Obtener los ultimos 100 clientes 
  const obtenerClientes = async () => {
    try {
      const { data, success, message } = await useApiFetch<ApiResponse<any>>(
        `${role}/cliente`,
        {
          method: "POST",
          body: {
            action: "clientes",
          },
        },
      );
      if (success) {
        clientes.value = data ?? [];
      } else {
        toast.add({
          title: "Obteniendo clientes",
          description: message,
          icon: "i-lucide-shield-x",
          color: "error",
        });
      }
    } catch (err) {
      toast.add({
        title: "Obteniendo clientes",
        description: err instanceof Error ? err.message : "Ocurrió un error inesperado",
        icon: "i-lucide-shield-x",
        color: "error",
      });
    } finally {
    }
  }
  // Buscar Cliente
  async function buscarCliente(query: string) {
    try {
      loading.value = true;
      const { data, success, message } = await useApiFetch<ApiResponse<any>>(
        `${role}/cliente`,
        {
          method: "POST",
          body: {
            action: "buscar_cliente",
            buscar: query,
          },
        },
      );
      if (success) {
        console.log(data, success, message)
        //Filtramos los nuevos para dejar solo los que NO están en el original
        const elementosUnicos = data.filter((nuevo: any) =>
          !clientes.value.some(original => original.id === nuevo.id)
        );
        clientes.value.push(...elementosUnicos)
      } else {
        toast.add({
          title: "No encontrado",
          description: message,
          icon: "i-lucide-search",
          color: "error",
        });
      }

    } catch (err) {
      toast.add({
        title: "No encontrado",
        description: String(err),
        icon: "i-lucide-search",
        color: "error",
      });
    } finally {
      loading.value = false;
    }
  }
  return {
    loading,
    error,
    clientes,
    actualizarDatosPedido,
    datosIniciales,
    obtenerClientes,
    buscarCliente
  };
};
