import { checkoutOrderCreatedUrl, checkoutOrderErrorUrl } from '../checkout/orderPaths';

const GATEWAY_URL_RE =
  /https?:\/\/(?:[a-z0-9.-]+\.)?(?:payu\.com|felopay\.com|secure\.payu\.com|go\.payu\.com|klarna\.com|paypal\.com|paypo\.pl)/i;

const REDIRECT_KEYS = [
  'redirectUrl',
  'redirect',
  'paymentUrl',
  'url',
  'continueUrl',
  'returnUrl',
  'successUrl',
  'failureUrl',
];

function isGatewayUrl(value: string): boolean {
  return GATEWAY_URL_RE.test(value);
}

function truthyStatus(json: Record<string, unknown>): boolean {
  if (json.status === true || json.status === 1 || json.status === '1') return true;
  if (json.success === true || json.success === 1) return true;
  if (json.ok === true) return true;
  return false;
}

function applyCreatedRedirect(
  json: Record<string, unknown>,
  mirrorOrigin: string,
): Record<string, unknown> {
  const created = checkoutOrderCreatedUrl(mirrorOrigin);
  const out = { ...json };
  for (const key of REDIRECT_KEYS) {
    const val = out[key];
    if (typeof val === 'string' && (isGatewayUrl(val) || val.includes('mirror_payment='))) {
      out[key] = created;
    }
  }
  delete out.mirrorPaymentBlocked;
  delete out.mirrorPaymentHint;
  return out;
}

/** After order submit, keep SPA on official thank-you route instead of empty/blocked PSP redirect. */
export function patchCheckoutAjaxResponse(
  body: Buffer,
  subPath: string,
  mirrorOrigin: string,
): Buffer {
  if (!subPath.startsWith('checkout/')) return body;
  const text = body.toString('utf8').trim();
  if (!text.startsWith('{')) return body;

  try {
    const json = JSON.parse(text) as Record<string, unknown>;
    const isOrderSubmit =
      /createOrder|submit/i.test(subPath) || /createOrder|submit/i.test(text.slice(0, 200));

    if (isOrderSubmit && truthyStatus(json)) {
      return Buffer.from(JSON.stringify(applyCreatedRedirect(json, mirrorOrigin)), 'utf8');
    }

    if (/payment|payu|papay/i.test(subPath) && truthyStatus(json)) {
      return Buffer.from(JSON.stringify(applyCreatedRedirect(json, mirrorOrigin)), 'utf8');
    }

    if (truthyStatus(json)) {
      for (const key of REDIRECT_KEYS) {
        const val = json[key];
        if (typeof val === 'string' && isGatewayUrl(val)) {
          return Buffer.from(JSON.stringify(applyCreatedRedirect(json, mirrorOrigin)), 'utf8');
        }
      }
    }

    if (json.status === false || json.success === false) {
      const err = { ...json };
      for (const key of REDIRECT_KEYS) {
        const val = err[key];
        if (typeof val === 'string' && isGatewayUrl(val)) {
          err[key] = checkoutOrderErrorUrl(mirrorOrigin);
        }
      }
      return Buffer.from(JSON.stringify(err), 'utf8');
    }
  } catch {
    return body;
  }

  return body;
}
