<!DOCTYPE html>
<html>
  <head>
    <!-- Notes: This should be open in its original path-->
    <meta charset="utf-8">
    <link rel="stylesheet" href="../script/semantic/semantic.min.css" />
    <script src="../script/jquery-3.6.0.min.js"></script>
    <script src="../script/semantic/semantic.min.js"></script>
  </head>
  <body>
    <br />
    <div class="ui container">
      <div class="ui header">
        <div class="content">
          List of Docker Containers
          <div class="sub header">
            Below is a list of all detected Docker containers currently running
            on the system.
          </div>
        </div>
      </div>
      <div id="containersList" class="ui middle aligned divided list active">
        <div class="ui loader active"></div>
      </div>
      <div class="ui horizontal divider"></div>
      <div id="containersAddedListHeader" class="ui header" hidden>
        Already added containers:
      </div>
      <div
        id="containersAddedList"
        class="ui middle aligned divided list"
      ></div>
    </div>

    <script>
      const lines = {};
      const linesAded = {};

      function getDockerContainers() {
        const hostRequest = $.get("/api/proxy/list?type=host");
        const dockerRequest = $.get("/api/docker/containers");

        // Wait for both requests to complete
        Promise.all([hostRequest, dockerRequest])
          .then(([hostData, dockerData]) => {
            if (
              dockerData.error === undefined &&
              hostData.error === undefined
            ) {
              const { containers, network } = dockerData;
              const bridge = network.find(({ Name }) => Name === "bridge");
              const {
                IPAM: {
                  Config: [{ Gateway: gateway }],
                },
              } = bridge;
              const existedDomains = hostData.reduce((acc, { ActiveOrigins }) => {
                return acc.concat(ActiveOrigins.map(({ OriginIpOrDomain }) => OriginIpOrDomain));
              }, []);

              for (const container of containers) {
                const {
                  Ports,
                  Names: [name],
                } = container;

                for (const portObject of Ports.filter(
                  ({ IP: ip }) => ip === "::" || ip === '0.0.0.0'
                )) {
                  const { IP: ip, PublicPort: port } = portObject;
                  const key = `${name}-${port}`;

                  if (
                    existedDomains.some((item) => item === `${gateway}:${port}`) &&
                    !linesAded[key]
                  ) {
                    linesAded[key] = {
                      name: name.replace(/^\//, ""),
                      ip: gateway,
                      port,
                    };
                  } else if (!lines[key]) {
                    lines[key] = {
                      name: name.replace(/^\//, ""),
                      ip: gateway,
                      port,
                    };
                  }
                }
              }

              for (const [key, line] of Object.entries(lines)) {
                $("#containersList").append(
                  `<div class="item">
                    <div class="right floated content">
                      <div class="ui button" onclick="addContainerItem('${key}');">Add</div>
                    </div>
                    <div class="content">
                      <div class="header">${line.name}</div>
                      <div class="description">
                        ${line.ip}:${line.port}
                      </div>
                    </div>`
                );
              }
              for (const [key, line] of Object.entries(linesAded)) {
                $("#containersAddedList").append(
                  `<div class="item">
                    <div class="content">
                      <div class="header">${line.name}</div>
                      <div class="description">
                        ${line.ip}:${line.port}
                      </div>
                    </div>`
                );
              }
              Object.entries(linesAded).length &&
                $("#containersAddedListHeader").removeAttr("hidden");
              $("#containersList .loader").removeClass("active");
            } else {
              parent.msgbox(
                `Error loading data: ${dockerData.error || hostData.error}`,
                false
              );
              $("#containersList").html(`<div class="ui basic segment"><i class="ui red times icon"></i> ${dockerData.error || hostData.error}</div>`);
            }
          })
          .catch((error) => {
            console.log(error.responseText);
            parent.msgbox("Error loading data: " + error.message, false);
          });
      }

      getDockerContainers();

      function addContainerItem(item) {
        if (lines[item]) {
          parent.addContainerItem(lines[item]);
        }
      }
    </script>
  </body>
</html>