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

/**
 * Runs only on /pl/pl/checkout/order/ (official Sinsay SPA).
 * Blocks navigation to upstream PSP hosts; exposes mirror payment API paths.
 */
export function buildCheckoutPaymentBridge(): string {
  const payApi = '/api/checkout/order';
  const orderPath = config.intercept.checkoutOrderPath;
  const payEnabled = config.checkout.payEnabled;

  return `<script data-proxy="checkout-payment">(function(){
  var ORDER_PATH='${orderPath}';
  var PAY_API='${payApi}';
  var PAY_ENABLED=${payEnabled};
  if(location.pathname!==ORDER_PATH&&!/^\\/pl\\/pl\\/checkout\\/order\\/?$/.test(location.pathname))return;

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

  function isGatewayUrl(u){
    try{return GATEWAY_RE.test(String(u))||GATEWAY_SUB.test(String(u));}catch(e){return false;}
  }

  function stayOnOrder(u){
    try{
      var p=new URL(String(u),location.origin).pathname;
      return p===ORDER_PATH||/^\\/pl\\/pl\\/checkout\\/order\\/?$/.test(p);
    }catch(e){return false;}
  }

  function blockExternal(url){
    return isGatewayUrl(url)&&!stayOnOrder(url);
  }

  window.__MIRROR_CHECKOUT_PAYMENT__={
    api:PAY_API,
    payEnabled:PAY_ENABLED,
    orderPath:ORDER_PATH
  };

  var _assign=location.assign.bind(location);
  var _replace=location.replace.bind(location);
  location.assign=function(u){if(blockExternal(u)){console.warn('[mirror] blocked payment redirect',u);return;}return _assign(u);};
  location.replace=function(u){if(blockExternal(u)){console.warn('[mirror] blocked payment redirect',u);return;}return _replace(u);};

  var _open=window.open;
  window.open=function(u,t,f){if(u&&blockExternal(u)){console.warn('[mirror] blocked payment window',u);return null;}return _open.apply(window,arguments);};

  document.addEventListener('click',function(ev){
    var a=ev.target&&ev.target.closest?ev.target.closest('a[href]'):null;
    if(!a)return;
    var h=a.getAttribute('href')||'';
    if(blockExternal(h)){ev.preventDefault();ev.stopPropagation();console.warn('[mirror] blocked payment link',h);}
  },true);

  function scrubPaymentJson(obj){
    if(!obj||typeof obj!=='object')return obj;
    if(Array.isArray(obj))return obj.map(scrubPaymentJson);
    var out={};
    for(var k in obj){
      if(!Object.prototype.hasOwnProperty.call(obj,k))continue;
      var v=obj[k];
      if(typeof v==='string'&&(k==='redirectUrl'||k==='redirect'||k==='paymentUrl'||k==='url'||k==='continueUrl')&&isGatewayUrl(v)){
        out[k]=null;
        out.mirrorPaymentBlocked=true;
        out.mirrorPaymentApi=PAY_API;
        continue;
      }
      out[k]=scrubPaymentJson(v);
    }
    return out;
  }

  var _fetch=window.fetch;
  if(_fetch){
    window.fetch=function(input,init){
      var url=typeof input==='string'?input:(input&&input.url?input.url:'');
      if(blockExternal(url)){
        return Promise.resolve(new Response(JSON.stringify({
          ok:false,
          mirrorPaymentBlocked:true,
          mirrorPaymentApi:PAY_API,
          error:'Upstream payment gateway blocked — use '+PAY_API
        }),{status:200,headers:{'content-type':'application/json'}}));
      }
      return _fetch.apply(window,arguments).then(function(res){
        var ct=res.headers.get('content-type')||'';
        if(ct.indexOf('json')<0)return res;
        return res.clone().json().then(function(data){
          if(!data||!scrubPaymentJson(data).mirrorPaymentBlocked)return res;
          var cleaned=scrubPaymentJson(data);
          return new Response(JSON.stringify(cleaned),{status:res.status,headers:{'content-type':'application/json'}});
        }).catch(function(){return res;});
      });
    };
  }

  var q=location.search||'';
  if(q.indexOf('mirror_payment=')>=0){
    fetch(PAY_API+'/payment/status',{credentials:'include'})
      .then(function(r){return r.json();})
      .then(function(data){
        if(data&&data.status)console.info('[mirror] payment status',data.status,data.reference||'');
      })
      .catch(function(){});
  }
})();</script>`;
}
