import { useAuth } from "@/components/providers";
import { configuracionApi, type FlagsConfiguracion } from "@/lib/api";
import { useQuery } from "@tanstack/react-query";
import { useMemo } from "react";

export type FlagsConfiguracionEstado = FlagsConfiguracion & {
  // false solo mientras no hay respuesta, ni caché, ni error: en ese lapso los
  // flags valen DEFAULTS_SIN_DATO y las pantallas no deben decidir nada
  // irreversible (p. ej. mostrar "función no habilitada").
  listo: boolean;
};

// Sin dato se comporta como antes de existir los parámetros (todo encendido),
// salvo lo que siempre dependió de una respuesta explícita del servidor.
const DEFAULTS_SIN_DATO: FlagsConfiguracion = {
  usaFacturacion: false,
  permiteTiendas: true,
  permiteProductosPropios: true,
  usaWhatsapp: false,
  usaFotos: true,
  usaDanos: true,
  usaPdfEscaner: true,
  usaCosasTrae: true,
  usaMecanicos: true,
  usaFirmaCliente: true,
  usaFirmaRecepcion: true,
  exigeFechaSalida: true,
  unaOtPorVehiculo: true,
  bloqueaVentaBajoCosto: true,
  exigeMotivoCambio: true,
  usaLinkPublicoCotizacion: true,
  usaEstadoPublico: true,
  usaHistorial: true,
  usaReportes: true,
  usaCargasMasivas: true,
  usaBitacora: true,
  imprimeRecepcion: true,
  imprimeCotizacion: true,
  imprimeEntrega: true,
  imprimeOrdenInterna: true,
  exigePagoParaEntrega: true,
};

const CACHE_PREFIX = "taller-flags-configuracion:";

function leerCache(tenantId: number | undefined): FlagsConfiguracion | null {
  try {
    if (typeof window === "undefined") return null;
    const raw = window.localStorage.getItem(`${CACHE_PREFIX}${tenantId ?? "sin-tenant"}`);
    if (!raw) return null;
    const parsed = JSON.parse(raw);
    return parsed && typeof parsed === "object" ? { ...DEFAULTS_SIN_DATO, ...parsed } : null;
  } catch {
    return null;
  }
}

function guardarCache(tenantId: number | undefined, flags: FlagsConfiguracion) {
  try {
    window.localStorage.setItem(`${CACHE_PREFIX}${tenantId ?? "sin-tenant"}`, JSON.stringify(flags));
  } catch {
    // Almacenamiento lleno o bloqueado: la app sigue sin caché.
  }
}

export function useFlagsConfiguracion(): FlagsConfiguracionEstado {
  const { user } = useAuth();
  const tenantId = user?.tenantId;

  const { data, isError } = useQuery({
    queryKey: ["configuracion", "flags", tenantId ?? null],
    queryFn: async () => {
      const flags = await configuracionApi.flags();
      guardarCache(tenantId, flags);
      return flags;
    },
  });

  const cache = useMemo(() => leerCache(tenantId), [tenantId]);

  return useMemo(() => {
    const fuente = data ?? cache;
    return {
      ...DEFAULTS_SIN_DATO,
      ...(fuente ?? {}),
      listo: Boolean(fuente) || isError,
    };
  }, [data, cache, isError]);
}
