// ******************************************
// * $Id$
// *
// *   send2address()
// *
// * send2address sends notification or order to a known prs_bedrijfadres
// *
// * arguments:
// *           prs_bedrijfadres_key to send something to
// *           ....
// *
// * Notes:         may overrule puo_loglevel. Caller must remember/reset
// *
// ******************************************
function send2address( bedrijfadres_key
                     , XMLnode
                     , refkey
                     , params)
{
    params = params || {};

    Log2File(2, "\n*> send2address");

    var SendOrderResult = { resultcode: 1 };
    try
    {
        var sqlB = "SELECT prs_bedrijfadres_url, "
                 + "       prs_bedrijfadres_sender, "
                 + "       prs_bedrijfadres_replyaddress, "
                 + "       prs_bedrijfadres_encoding, "
                 + "       prs_bedrijfadres_ordermode, "
                 + "       NVL(replace(prs_bedrijfadres_xsl, '\\', '/'), 'xsl/" + customerId + ".xsl') prs_bedrijfadres_xsl, "
                 + "       prs_bedrijfadres_certificate, "
                 + "       prs_bedrijfadres_error_handler, "
                 + "       prs_bedrijfadres_plugin, "
                 + "       prs_bedrijfadres_plugindata, "
                 + "       prs_bedrijfadres_attachfile,"
                 + "       prs_bedrijfadres_flexfiles,"
                 + "       ba.mld_typeopdr_key, "
                 + "       ba.prs_bedrijfadres_ext, "
                 + "       ba.prs_bedrijfadres_username,"
                 + "       ba.prs_bedrijfadres_password,"
                 + "       ba.prs_bedrijfadres_authmethod,"
                 + "       ba.prs_bedrijfadres_oa_token_url,"
                 + "       ba.prs_bedrijfadres_oa_scope," // unused yet
                 + "       ba.prs_bedrijfadres_oa_resource," // unused yet
                 + "       ba.prs_bedrijfadres_soapversion,"
                 + "       ba.prs_bedrijfadres_soapaction,"
                 + "       ba.prs_bedrijfadres_locksecret,"
                 + "       ba.prs_bedrijfadres_loglevel,"
                 + "       ba.prs_bedrijfadres_charset"
                 + "  FROM prs_bedrijfadres ba "
                 + " WHERE prs_bedrijfadres_key = " + bedrijfadres_key
                 + "   AND prs_bedrijfadres_startdatum <= SYSDATE";  // Onwaarschijnlijk maar mogelijk is hij achteraf 'disabled' door datum in de toekomst te zetten

        Log2File(3, sqlB);
        var oRsB = Oracle.Execute(sqlB);
        if (oRsB.EOF)
        {
            oRsB.Close();
            var tekst = "Fatal error: prs_bedrijfadres_key {0} not found or not yet valid".format(bedrijfadres_key);
            Log2File(1, tekst);
            SendOrderResult = { resultcode: -1, errtext: tekst };
            return SendOrderResult;
        }

        try
        {
            var plugindata = JSON.parse(oRsB("prs_bedrijfadres_plugindata").Value || "{}");
        }
        catch (e)
        {
            var tekst = "Error parsing JSON plugindata: {0}\n{1} {2}".format(oRsB("prs_bedrijfadres_plugindata").Value, e.message, e.name);
            Log2File(1, tekst);
            SendOrderResult = { resultcode: -1, errtext: tekst };
            return SendOrderResult;
        }

        var bedrijfadres = { bedrijfadres_key: bedrijfadres_key,
                             url:              oRsB("prs_bedrijfadres_url").Value,
                             sender:           oRsB("prs_bedrijfadres_sender").Value,
                             reply:            oRsB("prs_bedrijfadres_replyaddress").Value,
                             encoding:         oRsB("prs_bedrijfadres_encoding").Value,
                             ordermode:        oRsB("prs_bedrijfadres_ordermode").Value || 0,
                             typeopdr_key:     oRsB("mld_typeopdr_key").Value,
                             certificateName:  oRsB("prs_bedrijfadres_certificate").Value || "",
                             error_handling:   oRsB("prs_bedrijfadres_error_handler").Value || 0,
                             plugin:           oRsB("prs_bedrijfadres_plugin").Value,
                             plugindata:       plugindata,
                             extension:        oRsB("prs_bedrijfadres_ext").Value || "",
                             flexfiles:        oRsB("prs_bedrijfadres_flexfiles").Value,
                             AttachFile:       oRsB("prs_bedrijfadres_attachfile").Value,// Eén vaste bijlage ('algemene voorwaarden') om bij te sluiten
                             XSLbedr:          oRsB("prs_bedrijfadres_xsl").Value.toLowerCase(),
                             username:         oRsB("prs_bedrijfadres_username").Value,
                             password:         oRsB("prs_bedrijfadres_password").Value,
                             authmethod:       oRsB("prs_bedrijfadres_authmethod").Value || 0,
                             token_url:        oRsB("prs_bedrijfadres_oa_token_url").Value,
                             oa_scope:         oRsB("prs_bedrijfadres_oa_scope").Value,
                             oa_resource:      oRsB("prs_bedrijfadres_oa_resource").Value,
                             soapversion:      oRsB("prs_bedrijfadres_soapversion").Value,
                             soapaction:       oRsB("prs_bedrijfadres_soapaction").Value,
                             locksecret:       oRsB("prs_bedrijfadres_locksecret").Value,
                             loglevel:         oRsB("prs_bedrijfadres_loglevel").Value,
                             charset:          oRsB("prs_bedrijfadres_charset").Value
                           };
        oRsB.Close();
        if (bedrijfadres.loglevel > S("puo_loglevel"))
        {
            settings.overrule_setting("puo_loglevel", bedrijfadres.loglevel); // caller must reset it!
            Log2File(1, "puo_loglevel overruled by prs_bedrijfadres_loglevel: " + bedrijfadres.loglevel);
        }

        puo_hook.initialize(bedrijfadres);

        if (bedrijfadres.url.substring(0, 1) == '@') // intern, bijvoorbeeld @/appl/exp/zendesk.asp
        {
            if (!S("puo_fclt_web_url"))
            {
                throw { description: "Error: puo_fclt_web_url not set. Cannot use relative url: " + bedrijfadres.url};
            }
            bedrijfadres.orgurl = bedrijfadres.url; // zodat overrule er van af blijft
            bedrijfadres.url = S("puo_fclt_web_url") + bedrijfadres.url.substring(1);
            bedrijfadres.url += (bedrijfadres.url.indexOf("?")>=0?"&":"?") + "fac_id=" + customerId;
            bedrijfadres.url += "&bdradr_key=" + bedrijfadres_key;
            if (S("puo_loglevel") > 0)
                bedrijfadres.url += "&logging=" + S("puo_loglevel"); // dan de ASP ook loggen
            if (XMLnode)
                bedrijfadres.url += "&XMLnode=" + XMLnode;
            if (refkey)
                bedrijfadres.url += "&refkey=" + refkey;
            if (params.srtcode)
                bedrijfadres.url += "&srtnoti=" + params.srtcode;
        }

        var connect = new ConnectorCls();
        connect.connect(bedrijfadres);

        puo_hook.callhook("post_connect", {});

        if (!connect.Connected)
        {
            var tekst = "Could not connect, invalid technical adress '{0}' for prs_bedrijfadres_key {1}?".format(bedrijfadres.url, bedrijfadres_key);
            Log2File(1, tekst);
            if (params.marksent)
                params.marksent(XMLnode, refkey, -1, tekst);
            // TODO: Wel blijven proberen?
            result = null;
        }
        else
        {
            // fouten worden afgevangen in fetchXMLContent. Indien geen xml aangemaakt
            // kan worden levert de functie een lege string. Voor orders gaan we dit blijven
            // herhalen totdat de order wel verstuurd kan worden.
            if (params.xml_content)
                xml_content = params.xml_content
            else
                var xml_content = fetchXMLContent( XMLnode
                                                 , XMLnode=="reservering"?null:refkey
                                                 , XMLnode=="reservering"?refkey:params.extrakey
                                                 , "" // where
                                                 , params.taal
                                                 , { srtnotificatie: params.srtcode,
                                                     aanmaak: params.aanmaak,
                                                     notificatie_key: params.notificatie_key }
                                                 );
            if (xml_content)
            {
                var Bijlagen = {};

                if ((bedrijfadres.flexfiles||S("puo_order_flexfiles")) == 1 && XMLnode == "opdracht")
                {
                    Bijlagen = { module: "MLD"
                               , niveau: "O"
                               , refkey: refkey
                               };
                }
                if (bedrijfadres.flexfiles == 1 && XMLnode == "bestelopdr")
                {
                    Bijlagen = { module: "BES"
                               , niveau: "B"
                               , refkey: params.ordernr.split("/")[0]
                               };
                }
                if (bedrijfadres.flexfiles == 1 && XMLnode == "reservering")
                    {
                        Bijlagen = { module: "RES"
                                   , niveau: "R"
                                   , refkey: refkey
                                   };
                    }
                if (Bijlagen.module)
                    Log2File(1, "Searching attachments under: " + JSON.stringify(Bijlagen));

                var XSLfile = getXslNode(bedrijfadres.XSLbedr, XMLnode);

                Log2File(3, "In send2address sender=" + bedrijfadres.sender);
                Log2File(4, "xsl=" + bedrijfadres.XSLbedr + "==>" + XSLfile);
                Log2File(4, "xmlnode=" + XMLnode);
                Log2File(4, "bedrijfadres:\n" + JSON.stringify(bedrijfadres, null, 4));

                var SendOrderResult = SendOrder( connect
                                                , xml_content
                                                , bedrijfadres
                                                , XSLfile
                                                , params.ordernr
                                                , refkey
                                                , params.sender
                                                , XMLnode
                                                , params.srtcode
                                                , Bijlagen
                                                , params.subject);

                Log2File(1, "SendOrderResult: " + SendOrderResult.resultcode);
                var tekst = [];
                if (connect.friendlyurl)
                    tekst.push(connect.friendlyurl);
                if (SendOrderResult.errtext)
                    tekst.push(SendOrderResult.errtext);
                if (params.marksent)
                    params.marksent(XMLnode, refkey, SendOrderResult.resultcode, tekst.join("\n"));

                if (SendOrderResult.resultcode == 0 || SendOrderResult.resultcode == 2)
                {
                    result = SendOrderResult;
                    // send notification to supplier is possibly done by mld_opdr/bes_bestelopdr
                    // notification triggers when we change the status
                }
            } // if (XMLcontent)

            connect.disconnect()
        } // if (connect.Connected)

        if (SendOrderResult.resultcode != 0 && SendOrderResult.resultcode != 2)
        {
            Log2File(0, "Sending to prs_bedrijfadres failed. Errorcode:" + SendOrderResult.resultcode);
        }
        else
        {
            Log2File(2, "Sending to prs_bedrijfadres was successful");
        }
    }
    catch(e)
    {
        Log2File(0, "Error in send2address: " + e.description, "E");
    }

    puo_hook.callhook("finalize", {});
    puo_hook.finalize();

    return SendOrderResult;
}

function getXslNode(pXslFile, pNode)
{
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var custIDxsl = "xsl/" + customerId.toLowerCase() + ".xsl";

  var vFile = pXslFile;
  if (vFile == custIDxsl)
  {
    vFile = "xsl/" + pNode + ".xsl";
    if (!fso.FileExists(custabspath + "/" + vFile))
    {
      vFile = pXslFile;
    }
  }

  return vFile;
}

function marksent(XMLnode, OpdrKey, resultcode, tekst)
{
  if (XMLnode == "planrequest")
     return; // die kent geen markorderassent

//  tekst += "\nFor contractor '{1}' key {2}".format(bedrijfnaam, Bedrijf_key);
  var sqlC = "BEGIN "
           + "    FAC.markorderassent(" + safe.quoted_sql(XMLnode)
                                        + ", " + OpdrKey
                                        + ", " + resultcode // failure
                                        + ", " + safe.quoted_sql(tekst)
                                        + ");"
           + " END;";
  Log2File(2, sqlC);
  Oracle.Execute(sqlC);
}