import { createHmac, timingSafeEqual } from 'node:crypto';

/**
 * Token de vista previa del borrador de la tienda. Lo pide el panel (usuario con
 * permiso de ver la configuración) y lo pasa la tienda al pedir la config con
 * preview: sin él, el endpoint público devuelve sólo lo publicado. Antes bastaba
 * con agregar `preview=true` a la URL para ver el borrador de cualquier tienda.
 */
const DURACION_MS = 30 * 60 * 1000;

const b64 = (s: string) => Buffer.from(s).toString('base64url');
const firmar = (payload: string, secreto: string) => createHmac('sha256', secreto).update(payload).digest('base64url');

export function crearTokenVistaPrevia(empresaId: string, secreto: string, ahora = Date.now()): string {
  const payload = b64(JSON.stringify({ e: empresaId, x: ahora + DURACION_MS }));
  return `${payload}.${firmar(payload, secreto)}`;
}

/** Devuelve la empresa del token si es válido y no venció; si no, null. */
export function verificarTokenVistaPrevia(token: string | undefined, secreto: string, ahora = Date.now()): string | null {
  if (!token || !secreto) return null;
  const [payload, firma] = token.split('.');
  if (!payload || !firma) return null;
  const esperada = Buffer.from(firmar(payload, secreto));
  const recibida = Buffer.from(firma);
  if (esperada.length !== recibida.length || !timingSafeEqual(esperada, recibida)) return null;
  try {
    const { e, x } = JSON.parse(Buffer.from(payload, 'base64url').toString()) as { e?: string; x?: number };
    return typeof e === 'string' && typeof x === 'number' && x > ahora ? e : null;
  } catch {
    return null;
  }
}
