class DownloadsController {
  constructor() {
    // Parts of tabbed section.
    this.tablist = document.querySelector('.js-tabSection');
    this.tabs = this.tablist.querySelectorAll('[role="tab"]');
    this.panels = document.querySelectorAll('[role="tabpanel"]');

    // OS for which to display download and install steps.
    this.osName = 'Unknown OS';

    // URL to JSON containing list of installer downloads.
    const fileListUrl = 'https://golang.org/dl/?mode=json';
    this.activeTabIndex = 0;

    // Get the install file list, then get names and sizes
    // for each OS supported on the install page.
    fetch(fileListUrl)
      .then((response) => response.json())
      .then((data) => {
        const files = data[0]['files'];
        for (var i = 0; i < files.length; i++) {
          let file = files[i].filename;
          let fileSize = files[i].size;
          if (file.match('.linux-amd64.tar.gz$')) {
            this.linuxFileName = file;
            this.linuxFileSize = Math.round(fileSize / Math.pow(1024, 2));
          }
          if (file.match('.darwin-amd64(-osx10.8)?.pkg$')) {
            this.macFileName = file;
            this.macFileSize = Math.round(fileSize / Math.pow(1024, 2));
          }
          if (file.match('.windows-amd64.msi$')) {
            this.windowsFileName = file;
            this.windowsFileSize = Math.round(fileSize / Math.pow(1024, 2));
          }
        }
        this.detectOS();
        const osTab = document.getElementById(this.osName);
        if (osTab !== null) {
          osTab.click();
        }
        this.setDownloadForOS(this.osName);
      })
      .catch(console.error);
      this.setEventListeners();
  }

  setEventListeners() {
    this.tabs.forEach((tabEl) => {
      tabEl.addEventListener('click', e => this.handleTabClick((e)));
    });
  }

  // Set the download button UI for a specific OS.
  setDownloadForOS(osName) {
    const baseURL = 'https://golang.org/dl/';
    let download;

    switch(osName){
      case 'linux':
        document.querySelector('.js-downloadButton').textContent =
          'Download Go for Linux';
        document.querySelector('.js-downloadDescription').textContent =
          this.linuxFileName + ' (' + this.linuxFileSize + ' MB)';
        document.querySelector('.js-download').href = baseURL + this.linuxFileName;
        break;
      case 'mac':
        document.querySelector('.js-downloadButton').textContent =
          'Download Go for Mac';
        document.querySelector('.js-downloadDescription').textContent =
          this.macFileName + ' (' + this.macFileSize + ' MB)';
        document.querySelector('.js-download').href = baseURL + this.macFileName;
        break;
      case 'windows':
        document.querySelector('.js-downloadButton').textContent =
          'Download Go for Windows';
        document.querySelector('.js-downloadDescription').textContent =
          this.windowsFileName + ' (' + this.windowsFileSize + ' MB)';
        document.querySelector('.js-download').href = baseURL + this.windowsFileName;
        break;
      default:
        document.querySelector('.js-downloadButton').textContent = 'Download Go';
        document.querySelector('.js-downloadDescription').textContent =
          'Visit the downloads page.';
        document.querySelector('.js-download').href = baseURL;
        break;
    }
  }

  // Updates install tab with dynamic data.
  setInstallTabData(osName) {
    const fnId = `#${osName}-filename`;
    const el = document.querySelector(fnId);
    if (!el) {
      return;
    }
    switch(osName) {
      case 'linux':
        // Update filename for linux installation step
        if (this.linuxFileName) {
          el.textContent = this.linuxFileName;
        }
        break;
    }
  }

  // Detect the users OS for installation default.
  detectOS() {
    if (navigator.userAgent.indexOf('Linux') !== -1) {
      this.osName = 'linux';
    } else if (navigator.userAgent.indexOf('Mac') !== -1) {
      this.osName = 'mac';
    } else if (navigator.userAgent.indexOf('X11') !== -1) {
      this.osName = 'unix';
    } else if (navigator.userAgent.indexOf('Win') !== -1) {
      this.osName = 'windows';
    }
  }

  // Activates the tab at the given index.
  activateTab(index) {
    this.tabs[this.activeTabIndex].setAttribute('aria-selected', 'false');
    this.tabs[this.activeTabIndex].setAttribute('tabindex', '-1');
    this.panels[this.activeTabIndex].setAttribute('hidden', '');
    this.tabs[index].setAttribute('aria-selected', 'true');
    this.tabs[index].setAttribute('tabindex', '0');
    this.panels[index].removeAttribute('hidden');
    this.tabs[index].focus();
    this.activeTabIndex = index;
  }

  // Handles clicks on tabs.
  handleTabClick(e) {
    const el = (e.target);
    this.activateTab(Array.prototype.indexOf.call(this.tabs, el));
    this.setDownloadForOS(el.id);
    this.setInstallTabData(el.id);
  }

}

// Instantiate controller for page event handling.
new DownloadsController();
