import { NextRequest, NextResponse } from 'next/server';
import { revalidateTag } from 'next/cache';

/**
 * Revalidación on-demand del cache de datos del storefront.
 *
 * El backend ERP la llama (fire-and-forget) inmediatamente después de
 * publicar o restaurar la config ecommerce de una tienda
 * (`EcommerceAdminService.publish/rollback`), así el visitante ve los
 * cambios sin esperar el TTL de `revalidate: 60` de `loadStoreConfig` /
 * `loadStoreCatalog` — que sigue actuando como techo de seguridad si este
 * webhook falla o no se dispara.
 *
 * Autenticación: header `x-revalidate-secret` contra `REVALIDATE_SECRET`
 * (mismo secreto configurado en el backend como `REVALIDATE_SECRET`, enviado
 * junto con `STOREFRONT_REVALIDATE_URL`).
 *
 * Body: `{ empresaId?: string, subdominio?: string, dominio?: string }`. Los tags
 * usan el identificador que `storeConfig.ts` / `storeCatalog.ts` resuelven desde
 * el host: el subdominio, o el dominio entero si la tienda tiene dominio propio.
 * Se invalidan todos los que vengan, porque la misma tienda puede servirse por
 * los dos; `empresaId` queda como fallback.
 */
export async function POST(request: NextRequest) {
	const secret = process.env.REVALIDATE_SECRET;
	const provided = request.headers.get('x-revalidate-secret');

	if (!secret || !provided || provided !== secret) {
		return NextResponse.json({ revalidated: false, message: 'Unauthorized' }, { status: 401 });
	}

	let body: unknown;

	try {
		body = await request.json();
	} catch {
		return NextResponse.json({ revalidated: false, message: 'Solicitud inválida.' }, { status: 400 });
	}

	const { empresaId, subdominio, dominio } = (body ?? {}) as {
		empresaId?: string;
		subdominio?: string;
		dominio?: string;
	};
	const claves = [subdominio, dominio].filter((v): v is string => Boolean(v));
	if (claves.length === 0 && empresaId) claves.push(empresaId);

	if (claves.length === 0) {
		return NextResponse.json({ revalidated: false, message: 'Falta empresaId o subdominio.' }, { status: 400 });
	}

	for (const clave of claves) {
		revalidateTag(`store-config-${clave}`);
		revalidateTag(`store-catalog-${clave}`);
	}

	return NextResponse.json({ revalidated: true });
}
