/**
 * Endpoint server-side para el refresh silencioso del access token.
 *
 * Flujo de seguridad:
 * 1. El cliente llama a POST /api-sveltekit/auth/silent-refresh con credentials:'include'
 *    (las cookies HttpOnly se envían automáticamente, sin que JS las lea).
 * 2. Este servidor lee el refresh_token de la cookie HttpOnly.
 * 3. Llama al backend FastAPI /v1/auth/refresh con el refresh_token.
 * 4. Si es exitoso, actualiza las cookies HttpOnly con los nuevos tokens.
 * 5. Retorna solo el access_token al cliente (el refresh_token permanece en HttpOnly).
 *
 * De este modo el refresh_token NUNCA toca el código JavaScript del cliente.
 */

import { json } from '@sveltejs/kit';
import type { RequestEvent } from '@sveltejs/kit';
import { getServerApiUrl, applyRefreshedTokens, clearAuthTokens } from '$lib/server/api';
import { getAccessTokenFromCookies } from '$lib/server/access-token-cookie';

export const POST = async ({ cookies, fetch }: RequestEvent) => {
	const refreshToken = cookies.get('refresh_token');

	if (!refreshToken) {
		return json({ error: 'No refresh token available' }, { status: 401 });
	}

	try {
		const baseUrl = getServerApiUrl();

		// Sesión local actual del CRM (patrón SIWEB): se reenvía para preservar el
		// inicio de sesión y permitir el re-emitido de fallback cuando el refresh KC falla.
		const currentSession = getAccessTokenFromCookies(cookies);
		const sessionId = cookies.get('crm_sid');

		const response = await fetch(`${baseUrl}v1/auth/refresh`, {
			method: 'POST',
			headers: { 'Content-Type': 'application/json' },
			body: JSON.stringify({
				refresh_token: refreshToken,
				...(currentSession ? { session_token: currentSession } : {}),
				...(sessionId ? { session_id: sessionId } : {})
			})
		});

		if (!response.ok) {
			// El refresh falló y no hubo sesión local que re-emitir (cap superado o
			// patrón apagado). Limpiar cookies para que el server redirija al login.
			clearAuthTokens(cookies);

			const status = response.status === 401 ? 401 : 400;
			return json({ error: 'Refresh token expired or invalid' }, { status });
		}

		const data = (await response.json()) as {
			access_token?: string;
			refresh_token?: string;
			session_token?: string;
			session_id?: string;
			expires_in?: number;
		};

		// Actualiza cookies considerando la sesión local; devuelve el bearer de la app.
		const appToken = applyRefreshedTokens(cookies, data);

		// Devolver solo el token de app al cliente (sesión local si aplica, o KC).
		return json({ access_token: appToken ?? data.access_token ?? '' });
	} catch (error) {
		console.error('[silent-refresh] Error inesperado:', error);
		return json({ error: 'Internal server error' }, { status: 500 });
	}
};
