import { PrismaService } from 'src/prisma/prisma.service';

/**
 * Configuración que rige la tienda en producción: la versión PUBLICADA.
 *
 * "Guardar borrador" escribe las columnas vivas de `ecommerce_config`; lo que ve el
 * comprador tiene que salir del snapshot de la versión publicada. Antes el depósito,
 * la lista de precios, la sucursal y las notificaciones se leían de las columnas
 * vivas, así que un borrador sin publicar ya cambiaba el catálogo, el stock y los
 * pedidos reales (cambiar el depósito y guardar dejó a Comercial Kety con 128
 * productos de 1688 sin tocar "Publicar").
 *
 * Campo por campo: si el snapshot lo trae (aunque sea null) manda el snapshot; si es
 * un snapshot viejo que no lo congelaba, cae a la columna viva. Sin versión publicada,
 * todo sale de las columnas vivas.
 */
export async function leerConfigPublicada<K extends string>(
  prisma: PrismaService,
  empresaId: string,
  campos: readonly K[],
): Promise<Record<K, any> | null> {
  const config = await prisma.ecommerce_config.findUnique({ where: { empresa_id: empresaId } });
  if (!config) return null;

  const snap = config.published_version_id
    ? ((
        await prisma.ecommerce_config_version.findUnique({
          where: { id: config.published_version_id },
          select: { config_snapshot: true },
        })
      )?.config_snapshot as Record<string, unknown> | undefined)
    : undefined;

  const out = {} as Record<K, any>;
  for (const campo of campos) {
    out[campo] = snap && campo in snap ? snap[campo] : (config as Record<string, unknown>)[campo];
  }
  return out;
}

/**
 * Lo mismo en SQL, para las consultas crudas de la tienda pública. Espera los alias
 * `ec` (ecommerce_config) y `ev` (ecommerce_config_version unida por
 * `ev.id = ec.published_version_id`). Devuelve el valor como texto.
 */
export function campoPublicadoSql(campo: 'sucursal_id' | 'deposito_id' | 'lista_precios_id'): string {
  return `CASE WHEN ev.config_snapshot ? '${campo}' THEN ev.config_snapshot->>'${campo}' ELSE ec.${campo}::text END`;
}
