<dom-module id="coverage-plugin">
  <script>

    function populateWithDummyData(coverageData) {
      coverageData['NewFile'] = {
        linesMissingCoverage: [1, 2, 3],
        totalLines: 5,
        changeNum: 94,
        patchNum: 2,
      };
      coverageData['/COMMIT_MSG'] = {
        linesMissingCoverage: [3, 4, 7, 14],
        totalLines: 14,
        changeNum: 94,
        patchNum: 2,
      };
      coverageData['DEPS'] = {
        linesMissingCoverage: [3, 4, 7, 14],
        totalLines: 16,
        changeNum: 77001,
        patchNum: 1,
      };
      coverageData['go/sklog/sklog.go'] = {
        linesMissingCoverage: [3, 322, 323, 324],
        totalLines: 350,
        changeNum: 85963,
        patchNum: 13,
      };
    }

    Gerrit.install(plugin => {
      const coverageData = {};
      let displayCoverage = false;
      const annotationApi = plugin.annotationApi();
      annotationApi.addLayer(context => {
        if (Object.keys(coverageData).length === 0) {
          // Coverage data is not ready yet.
          return;
        }
        const path = context.path;
        const line = context.line;
        // Highlight lines missing coverage with this background color if
        // coverage should be displayed, else do nothing.
        const cssClass = displayCoverage
          ? Gerrit.css('background-color: #EF9B9B')
          : Gerrit.css('');
        if (coverageData[path] &&
              coverageData[path].changeNum === context.changeNum &&
              coverageData[path].patchNum === context.patchNum) {
          const linesMissingCoverage = coverageData[path].linesMissingCoverage;
          if (linesMissingCoverage.includes(line.afterNumber)) {
            context.annotateRange(0, line.text.length, cssClass, 'right');
            context.annotateLineNumber(cssClass, 'right');
          }
        }
      }).enableToggleCheckbox('Display Coverage', checkbox => {
        // Checkbox is attached so now add the notifier that will be controlled
        // by the checkbox.
        annotationApi.addNotifier(notifyFunc => {
          new Promise(resolve => setTimeout(resolve, 3000)).then(() => {
            populateWithDummyData(coverageData);
            checkbox.disabled = false;
            checkbox.onclick = e => {
              displayCoverage = e.target.checked;
              Object.keys(coverageData).forEach(file => {
                notifyFunc(file, 0, coverageData[file].totalLines, 'right');
              });
            };
          });
        });
      });
    });
  </script>
</dom-module>
