import { FastifyReply, FastifyRequest } from 'fastify';
import { request as undiciRequest } from 'undici';

import { config } from '../config';

const UPSTREAM_HOST = 'scripts.luigisbox.tech';
const ALLOWED_SCRIPTS = new Set(['LBX-826268.js']);

function patchLuigisboxScript(body: string): string {
  return body
    .replace(
      'let CDN_BASE="https://cdn.luigisbox.com/",APP_BASE="https://app.luigisbox.com/"',
      'let CDN_BASE="https://cdn.luigisbox.tech/",APP_BASE="https://app.luigisbox.tech/"',
    )
    .replace(
      '"www.sinsay.com"===window.location.hostname&&window.location.pathname.startsWith("/pl/pl")',
      '("www.sinsay.com"===window.location.hostname||"sinsaybuy.com"===window.location.hostname)&&window.location.pathname.startsWith("/pl/pl")',
    );
}

export async function handleLuigisboxProxy(
  request: FastifyRequest<{ Params: { '*': string } }>,
  reply: FastifyReply,
): Promise<void> {
  const scriptPath = request.params['*'] ?? '';
  const fileName = scriptPath.split('/').pop() ?? '';

  if (!ALLOWED_SCRIPTS.has(fileName)) {
    reply.status(403).send('Forbidden script');
    return;
  }

  const { statusCode, headers, body } = await undiciRequest(
    `https://${UPSTREAM_HOST}/${scriptPath}`,
    {
      method: 'GET',
      headers: {
        accept: 'application/javascript,*/*;q=0.8',
        'accept-encoding': 'identity',
        'user-agent':
          (request.headers['user-agent'] as string) ??
          'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        referer: 'https://www.sinsay.com/pl/pl/',
      },
      throwOnError: false,
    },
  );

  const chunks: Buffer[] = [];
  for await (const chunk of body) {
    chunks.push(chunk instanceof Buffer ? chunk : Buffer.from(chunk));
  }

  const contentType = String(headers['content-type'] ?? 'application/javascript');
  let responseBody = Buffer.concat(chunks);
  if (contentType.includes('javascript') || contentType.includes('ecmascript')) {
    responseBody = Buffer.from(patchLuigisboxScript(responseBody.toString('utf8')), 'utf8');
  }

  reply
    .type(contentType)
    .header('cache-control', 'public, max-age=300, stale-while-revalidate=300')
    .status(statusCode)
    .send(responseBody);
}

export function rewriteLuigisboxScripts(html: string): string {
  return html.replaceAll(
    'https://scripts.luigisbox.tech/',
    `${config.origin}${config.intercept.luigisboxProxyPrefix}/`,
  );
}
