const GitInfo = {
  /**
   * Version string to integer conversion.
   * @param {string} str
   * @return {number | false}
   */
  parseVersionString: function (str) {
    if (typeof str !== 'string') {
      return false;
    }
    let add = 0;
    // Parse possible alpha/beta/rc/
    const state = str.split('-');
    if (state.length >= 2) {
      if (state[1].substr(0, 2) === 'rc') {
        add = -20 - parseInt(state[1].substr(2), 10);
      } else if (state[1].substr(0, 4) === 'beta') {
        add = -40 - parseInt(state[1].substr(4), 10);
      } else if (state[1].substr(0, 5) === 'alpha') {
        add = -60 - parseInt(state[1].substr(5), 10);
      } else if (state[1].substr(0, 3) === 'dev') {
        /* We don't handle dev, it's git snapshot */
        add = 0;
      }
    }
    // Parse version
    const x = str.split('.');
    // Use 0 for non existing parts
    const maj = parseInt(x[0], 10) || 0;
    const min = parseInt(x[1], 10) || 0;
    const pat = parseInt(x[2], 10) || 0;
    const hotfix = parseInt(x[3], 10) || 0;
    return maj * 100000000 + min * 1000000 + pat * 10000 + hotfix * 100 + add;
  },
  /**
   * Indicates current available version on main page.
   * @param {object} data
   */
  currentVersion: function (data) {
    if (data && data.version && data.date) {
      const current = GitInfo.parseVersionString($('span.version').text());
      const latest = GitInfo.parseVersionString(data.version);
      const url = './url.php?url=https://www.phpmyadmin.net/files/' + Functions.escapeHtml(encodeURIComponent(data.version)) + '/';
      let versionInformationMessage = document.createElement('span');
      versionInformationMessage.className = 'latest';
      const versionInformationMessageLink = document.createElement('a');
      versionInformationMessageLink.href = url;
      versionInformationMessageLink.className = 'disableAjax';
      versionInformationMessageLink.target = '_blank';
      versionInformationMessageLink.rel = 'noopener noreferrer';
      const versionInformationMessageLinkText = document.createTextNode(data.version);
      versionInformationMessageLink.appendChild(versionInformationMessageLinkText);
      const prefixMessage = document.createTextNode(Messages.strLatestAvailable + ' ');
      versionInformationMessage.appendChild(prefixMessage);
      versionInformationMessage.appendChild(versionInformationMessageLink);
      if (latest > current) {
        const message = Functions.sprintf(Messages.strNewerVersion, Functions.escapeHtml(data.version), Functions.escapeHtml(data.date));
        let htmlClass = 'alert alert-primary';
        if (Math.floor(latest / 10000) === Math.floor(current / 10000)) {
          /* Security update */
          htmlClass = 'alert alert-danger';
        }
        $('#newer_version_notice').remove();
        const mainContainerDiv = document.createElement('div');
        mainContainerDiv.id = 'newer_version_notice';
        mainContainerDiv.className = htmlClass;
        const mainContainerDivLink = document.createElement('a');
        mainContainerDivLink.href = url;
        mainContainerDivLink.className = 'disableAjax';
        mainContainerDivLink.target = '_blank';
        mainContainerDivLink.rel = 'noopener noreferrer';
        const mainContainerDivLinkText = document.createTextNode(message);
        mainContainerDivLink.appendChild(mainContainerDivLinkText);
        mainContainerDiv.appendChild(mainContainerDivLink);
        $('#maincontainer').append($(mainContainerDiv));
      }
      if (latest === current) {
        versionInformationMessage = document.createTextNode(' (' + Messages.strUpToDate + ')');
      }
      /* Remove extra whitespace */
      const versionInfo = $('#li_pma_version').contents().get(2);
      if (typeof versionInfo !== 'undefined') {
        versionInfo.textContent = versionInfo.textContent.trim();
      }
      const $liPmaVersion = $('#li_pma_version');
      $liPmaVersion.find('span.latest').remove();
      $liPmaVersion.append($(versionInformationMessage));
    }
  },
  /**
   * Loads Git revision data from ajax for index.php
   */
  displayGitRevision: function () {
    $('#is_git_revision').remove();
    $('#li_pma_version_git').remove();
    $.get('index.php?route=/git-revision', {
      'server': CommonParams.get('server'),
      'ajax_request': true,
      'no_debug': true
    }).done(function (data) {
      if (typeof data !== 'undefined' && data.success === true) {
        $(data.message).insertAfter('#li_pma_version');
      }
    }).fail(function () {
      const gitHashInfoLi = '<li id="li_pma_version_git" class="list-group-item">' + window.Messages.errorLoadingGitInformation + '</li>';
      $(gitHashInfoLi).insertAfter('#li_pma_version');
    });
  }
};
AJAX.registerTeardown('home.js', function () {
  $('#themesModal').off('show.bs.modal');
});
AJAX.registerOnload('home.js', function () {
  $('#themesModal').on('show.bs.modal', function () {
    $.get('index.php?route=/themes', {
      'server': CommonParams.get('server')
    }, function (data) {
      $('#themesModal .modal-body').html(data.themes);
    });
  });

  /**
   * Load version information asynchronously.
   */
  if ($('li.jsversioncheck').length > 0) {
    $.ajax({
      dataType: 'json',
      url: 'index.php?route=/version-check',
      method: 'POST',
      data: {
        'server': CommonParams.get('server')
      },
      success: GitInfo.currentVersion
    });
  }
  if ($('#is_git_revision').length > 0) {
    setTimeout(GitInfo.displayGitRevision, 10);
  }
});