<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>
