<html>
  <head>
    <meta />
    <title>Showpad App</title>
    <meta />
  </head>
  <body style="margin: 0">
    <!-- Required CSS for the CSS Spinner while the app is loading -->
    <style>
      .css-spinner {
        border-radius: 50%;
        height: 100%;
        width: 100%;
        animation: spin 0.6s infinite linear;
        border-top: 2px solid #aaa;
        border-right: 2px solid #aaa;
        border-bottom: 2px solid #eee;
        border-left: 2px solid #eee;
        box-sizing: border-box;
      }

      @keyframes spin {
        from {
          transform: rotate(0deg);
        }
        to {
          transform: rotate(359deg);
        }
      }

      .spinner-container {
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
      }

      .spinner-container > div {
        width: 40px;
        height: 40px;
      }
    </style>

    <div id="loading-indicator" class="spinner-container">
      <div class="css-spinner"></div>
    </div>

    <div
      id="errorMessage"
      style="
        font-family: verdana;
        font-size: 150%;
        text-align: center;
        color: #00b191;
      "
    ></div>
    <iframe
      id="showpadFrame"
      name="showpadFrame"
      style="width: 100%; height: 100%; border: 0"
      scrolling="auto"
      >Your browser does not support iframes.
    </iframe>

    <script
      src="../../ClientGlobalContext.js.aspx"
      type="text/javascript"
    ></script>
    <script src="../scripts/dataRetrieval.js" type="text/javascript"></script>
    <script type="text/javascript">
      document.addEventListener("DOMContentLoaded", function () {
        var serverURL = window.parent.Xrm.Page.context.getClientUrl();
        var orgId =
          window.parent.Xrm.Page.context.organizationSettings.organizationId;
        var userid = window.parent.Xrm.Page.context
          .getUserId()
          .replace("{", "")
          .replace("}", "");
        var entityType = window.parent.Xrm.Page.data.entity.getEntityName();
        var entityId = window.parent.Xrm.Page.data.entity
          .getId()
          .replace("{", "")
          .replace("}", "");
        var fetchXmlName = location.search.substr(
          location.search.indexOf("=") + 1
        );
        var retryEmails = false;
        var retryUsers = false;
        var spUsers;
        var contacts = [];

        const distinct = (value, index, self) => {
          return self.indexOf(value) === index;
        };

        var emailFilter =
          "spd_entitytype eq '" +
          entityType +
          "' and spd_entityid eq '" +
          entityId +
          "'";
        if (fetchXmlName !== "")
          emailFilter += " and spd_fetchxmlname eq '" + fetchXmlName + "'";

        retrieveUsers();

        function retrieveUsers() {
          retrieveMultipleRecordsWebApi(
            serverURL,
            "spd_showpadusersettings",
            "spd_validtill,spd_accesstoken,spd_subdomain,spd_environment,spd_userinfo",
            "spd_userid eq '" + userid + "'",
            successCallbackUsers,
            function (error) {
              setError(
                "Something went wrong during the retrieval of the user setting: " +
                  error.message
              );
              return;
            }
          );
        }

        function successCallbackUsers(showpadUsers) {
          if ((!showpadUsers || !showpadUsers[0]) && !retryUsers) {
            retrieveUsers();
            retryUsers = true;
            return;
          }
          //If the returned object is a json, then an error occured.
          if (isJson(showpadUsers[0].spd_accesstoken)) {
            setError(
              "Something went wrong: " +
                JSON.parse(showpadUsers[0].spd_accesstoken).error_description
            );
            return;
          }
          spUsers = showpadUsers;
          retrieveEmails();
        }

        function retrieveEmails() {
          switch (entityType) {
            case "account":
              getCRMData(
                serverURL,
                "contacts",
                "contactid,emailaddress1",
                "_parentcustomerid_value eq '" + entityId + "'",
                "",
                function (response) {
                  successCallbackEmails(response.map((r) => r.emailaddress1));
                },
                function (error) {
                  setError(
                    "Something went wrong during the retrieval of the email addresses: " +
                      error.message
                  );
                  return;
                }
              );
              break;
            case "opportunity":
              getCRMData(
                serverURL,
                "opportunities",
                "_parentaccountid_value,parentcontactid",
                "opportunityid eq '" + entityId + "'",
                "parentcontactid($select=emailaddress1,fullname)",
                function (response) {
                  var accountId = response[0]._parentaccountid_value;
                  if (response[0].parentcontactid) {
                    contacts.push(response[0].parentcontactid.emailaddress1);
                  }
                  if (accountId) {
                    getCRMData(
                      serverURL,
                      "contacts",
                      "contactid,emailaddress1",
                      "_parentcustomerid_value eq '" + accountId + "'",
                      "",
                      function (response) {
                        var emails = response.map((r) => r.emailaddress1);
                        contacts = contacts.concat(emails);
                        successCallbackEmails(contacts);
                      },
                      function (error) {
                        setError(
                          "Something went wrong during the retrieval of the email addresses: " +
                            error.message
                        );
                        return;
                      }
                    );
                  } else {
                    successCallbackEmails(contacts);
                  }
                },
                function (error) {
                  setError(
                    "Something went wrong during the retrieval of the email addresses: " +
                      error.message
                  );
                  return;
                }
              );
              break;
            case "contact":
              getCRMData(
                serverURL,
                "contacts",
                "emailaddress1",
                "contactid eq '" + entityId + "'",
                "",
                function (response) {
                  successCallbackEmails(response.map((r) => r.emailaddress1));
                },
                function (error) {
                  setError(
                    "Something went wrong during the retrieval of the email addresses: " +
                      error.message
                  );
                  return;
                }
              );
              break;
            case "lead":
              getCRMData(
                serverURL,
                "leads",
                "emailaddress1",
                "leadid eq '" + entityId + "'",
                "",
                function (response) {
                  successCallbackEmails(response.map((r) => r.emailaddress1));
                },
                function (error) {
                  setError(
                    "Something went wrong during the retrieval of the email addresses: " +
                      error.message
                  );
                  return;
                }
              );
              break;
            default:
              break;
          }
        }

        function successCallbackEmails(showpadEmails) {
          if (!showpadEmails && !retryEmails) {
            emailFilter =
              "spd_entitytype eq '" +
              entityType +
              "' and spd_entityid eq '" +
              entityId +
              "'";
            retrieveEmails();
            retryEmails = true;
            return;
          }
          showpadEmails = showpadEmails.filter(distinct);
          //Show the data in the showpad application
          addDataToIframe(
            spUsers,
            showpadEmails,
            entityType,
            entityId,
            serverURL,
            orgId
          );
        }
      });

      function setLoading(show) {
        document.getElementById("loading-indicator").style.display = show
          ? "block"
          : "none";
      }

      //Show the retrieved data in the Showpad application
      //This is done with a post call to the iFrame
      function addDataToIframe(
        showpadUserSettings,
        showpadEmails,
        entityType,
        entityId,
        serverURL,
        orgId
      ) {
        document.getElementById("errorMessage").style.display = "none";
        document.getElementById("showpadFrame").style.display = "block";
        setLoading(false);

        var accesstoken = showpadUserSettings[0].spd_accesstoken;
        var subdomain = showpadUserSettings[0].spd_subdomain;
        var environment = showpadUserSettings[0].spd_environment;
        var userinfo = showpadUserSettings[0].spd_userinfo.split(";");

        var crm_data = {
          type: entityType,
          entityId: entityId,
          orgId: orgId,
          tenantUrl: serverURL,
          username: userinfo[0],
          email: userinfo[1],
          name: userinfo[2],
          locale: window.parent.Xrm.Page.context.getUserLcid(),
          organization: window.parent.Xrm.Page.context.getOrgUniqueName(),
        };
        var emails = showpadEmails || "";
        var data = {
          subdomain: subdomain,
          recipients: emails,
          access_token: accesstoken,
          crm_data: JSON.stringify(crm_data),
        };

        var showpadUrl = "https://showpad-insights";
        if (environment === "sandbox") showpadUrl += ".staging";
        showpadUrl += ".showpad.biz/";
        console.log(showpadUrl);
        postToIframe(data, showpadUrl, "showpadFrame");

        //Register an event listener so Showpad can retrieve extra related information
        if (window.addEventListener) {
          addEventListener("message", messageListener, false);
        } else {
          attachEvent("onmessage", messageListener);
        }
      }

      //Set the error message div
      function setError(errorMessage) {
        document.getElementById("errorMessage").style.display = "block";
        document.getElementById("errorMessage").innerText = errorMessage;
        document.getElementById("showpadFrame").style.display = "none";

        setLoading(false);
      }

      //Retrieve the data that is requested by Showpad after the application is loaded
      function messageListener(event) {
        var users = event.data.users || event.originalEvent.data.users;
        var contacts = event.data.contacts || event.originalEvent.data.contacts;

        var serverURL = window.parent.Xrm.Page.context.getClientUrl();

        var userFilter = "";
        for (var i = 0; i < users.length; i++) {
          if (userFilter === "")
            userFilter += "internalemailaddress eq '" + users[i] + "'";
          else userFilter += " or internalemailaddress eq '" + users[i] + "'";
        }

        var contactFilter = "";
        for (var j = 0; j < contacts.length; j++) {
          if (contactFilter === "")
            contactFilter += "emailaddress1 eq '" + contacts[j] + "'";
          else contactFilter += " or emailaddress1 eq '" + contacts[j] + "'";
        }
        retrieveMultipleRecordsWebApi(
          serverURL,
          "systemusers",
          "firstname,lastname,fullname,entityimage,internalemailaddress",
          userFilter,
          function (retrievedUsers) {
            retrieveMultipleRecordsWebApi(
              serverURL,
              "contacts",
              "firstname,lastname,fullname,department,jobtitle,emailaddress1",
              contactFilter,
              function (retrievedContacts) {
                document
                  .getElementById("showpadFrame")
                  .contentWindow.postMessage(
                    {
                      contacts: retrievedContacts,
                      users: retrievedUsers,
                    },
                    "*"
                  );
              },
              function (error) {
                alert(error.message);
              }
            );
          },
          function (error) {
            alert(error.message);
          }
        );
      }

      //Post the data to the iFrame with the Showpad application
      function postToIframe(data, url, target) {
        var form = document.createElement("form");
        form.action = url;
        form.method = "post";
        form.target = target;
        form.id = "postToIframe";
        document.body.appendChild(form);

        for (var key in data) {
          if (data.hasOwnProperty(key)) {
            var input = document.createElement("input");
            input.type = "hidden";
            input.name = key;
            input.value = data[key];
            form.appendChild(input);
          }
        }

        form.submit();
        document.body.removeChild(form);
      }
    </script>
  </body>
</html>
