import { ref } from "vue";
import type { PedidoGranel, Granalera, Piloto } from "~/types/PedidoGranel";
import { useClienteStore } from "~/store/cliente";

const clienteStore = useClienteStore();
interface ApiResponse<T> {
  success: boolean;
  message: string;
  data: T;
}

export const usePedidoGranel = () => {
  // ====================
  // STATES
  // ====================
  const pedidos = ref<PedidoGranel[]>([]);
  const granaleras = ref<Granalera[]>([]);
  const pilotos = ref<Piloto[]>([]);

  const loadingPedidos = ref(false);
  const loadingCrear = ref(false);
  const loadingUltimosPedidos = ref(false);

  const error = ref<string | null>(null);
  // =======================
  // OBTENER DATOS INICIALES
  // =======================
  const obtenerDatosIniciales = async (cliente_id: number) => {
    try {
      const response =
        await useHttp<ApiResponse<any>>(
          "/admin/pedido-granel",
          {
            method: "POST",
            body: {
              action: "datos_iniciales",
              cliente_id,
            },
          }
        );
      if (!response.success) throw new Error(response.message);
      granaleras.value = response.data.granaleras;
      pilotos.value = response.data.pilotos;
      clienteStore.setDireccionesOrigenes(
        response.data.direcciones,
        []
      );
      return response;
    } catch (err) {
      console.error(err);
      throw err;
    }
  };

  // ====================
  // OBTENER PEDIDOS
  // ====================
  const obtenerPedidos = async () => {
    try {

      loadingPedidos.value = true;
      error.value = null;

      const response =
        await useHttp<ApiResponse<PedidoGranel[]>>(
          "/admin/pedido-granel",
          {
            method: "POST",
            body: {
              action: "index",
            },
          }
        );
      pedidos.value = response.data;
      return response;
    } catch (err: any) {

      error.value =
        err?.data?.message ??
        "Error al obtener pedidos";
      throw err;
    } finally {
      loadingPedidos.value = false;
    }
  };

  // =============================================
  // OBTENER LOS ULTIMOS 5 PEDIDOS POR MEDIO DE ID
  // =============================================
  const obtenerUltimosPedidos = async (cliente_id: number) => {
    try {
      loadingUltimosPedidos.value = true;
      error.value = null;
      const response = await useHttp<ApiResponse<PedidoGranel[]>>(
        "/admin/pedido-granel",
        {
          method: "POST",
          body: {
            action: "ultimos_pedidos",
            cliente_id,
          },
        }
      );

      if (!response.success) {
        throw new Error(response.message);
      }

      return response.data;
    } catch (err: any) {
      error.value = err?.data?.message ?? "Error al obtener últimos pedidos";
      throw err;
    } finally {
      loadingUltimosPedidos.value = false;
    }
  };
  // ====================
  // CREAR PEDIDO
  // ====================

  const crearPedido = async (
    payload: PedidoGranel
  ) => {
    try {

      loadingCrear.value = true;
      error.value = null;

      const body = {
        action: "store",
        ...payload,
      };
      console.log(
        "BODY ENVIADO:",
        JSON.stringify(body, null, 2)
      );
      const response =
        await useHttp<ApiResponse<PedidoGranel>>(
          "/admin/pedido-granel",
          {
            method: "POST",
            body,
          }
        );
      if (!response.success) {
        throw new Error(response.message);
      }
      return response;
    } catch (err: any) {
      console.log(err);
      throw err;
    } finally {
      loadingCrear.value = false;
    }
  };

  return {
    pedidos,
    granaleras,
    pilotos,
    loadingPedidos,
    loadingCrear,
    error,
    obtenerPedidos,
    crearPedido,
    obtenerDatosIniciales,
    loadingUltimosPedidos,
    obtenerUltimosPedidos
  };
};
