import { ref } from "vue";
import * as OrdenLavanderiaRepository from "@/repositories/OrdenLavanderiaRepository";

/**
 * Impresión térmica de etiquetas de bolsa (recepción), reutilizable en POS, historial y semáforo.
 */
export function useEtiquetaBolsaImpresion() {
  const imprimiendoEtiquetaId = ref(null);

  async function ensureBolsasMinimas(ordenId, minCount = 1) {
    try {
      const res = await OrdenLavanderiaRepository.getById(ordenId);
      const orden = res?.data ?? res;
      const actuales = Array.isArray(orden?.bolsas) ? orden.bolsas.length : 0;
      if (actuales >= minCount) {
        return true;
      }
      const sync = await OrdenLavanderiaRepository.syncBolsas(ordenId, minCount);
      const updated = sync?.data ?? sync;
      return (Array.isArray(updated?.bolsas) ? updated.bolsas.length : 0) >= minCount;
    } catch {
      return false;
    }
  }

  async function imprimirEtiquetaTermica(ordenId, { indice = 1, todas = false, silent = false } = {}) {
    if (!ordenId) {
      throw new Error("Orden no válida.");
    }

    imprimiendoEtiquetaId.value = ordenId;
    try {
      if (todas) {
        const res = await OrdenLavanderiaRepository.getById(ordenId);
        const orden = res?.data ?? res;
        const total = Array.isArray(orden?.bolsas) ? orden.bolsas.length : 0;
        if (total < 1) {
          throw new Error("No hay bolsas. Indique la cantidad y guarde primero.");
        }
      } else if (!(await ensureBolsasMinimas(ordenId, 1))) {
        throw new Error("No se pudo generar el código de bolsa.");
      }

      const body = await OrdenLavanderiaRepository.imprimirEtiquetaBolsaTermica(ordenId, {
        posReception: true,
        indice: todas ? undefined : indice,
        todas,
      });

      if (body?.success || body?.impresion?.success) {
        return {
          success: true,
          message: body.message || body.impresion?.message || "Etiqueta enviada a la impresora.",
          silent,
        };
      }

      throw new Error(body?.impresion?.error || body?.message || "No se pudo imprimir la etiqueta.");
    } finally {
      imprimiendoEtiquetaId.value = null;
    }
  }

  return {
    imprimiendoEtiquetaId,
    ensureBolsasMinimas,
    imprimirEtiquetaTermica,
  };
}
