const etch = require('etch')
const EtchComponent = require('../etch-component')
const UpdateManager = require('../update-manager')

const $ = etch.dom

module.exports =
class UpdateView extends EtchComponent {
  constructor (props) {
    super(props)

    if (this.props.updateManager.getAutoUpdatesEnabled() && this.props.updateManager.getState() === UpdateManager.State.Idle) {
      this.props.updateManager.checkForUpdate()
    }
  }

  handleAutoUpdateCheckbox (e) {
    atom.config.set('core.automaticallyUpdate', e.target.checked)
  }

  shouldUpdateActionButtonBeDisabled () {
    let {state} = this.props.updateManager
    return state === UpdateManager.State.CheckingForUpdate || state === UpdateManager.State.DownloadingUpdate
  }

  executeUpdateAction () {
    if (this.props.updateManager.state === UpdateManager.State.UpdateAvailableToInstall) {
      this.props.updateManager.restartAndInstallUpdate()
    } else {
      this.props.updateManager.checkForUpdate()
    }
  }

  renderUpdateStatus () {
    let updateStatus = ''

    switch (this.props.updateManager.state) {
      case UpdateManager.State.Idle:
        updateStatus = $.div({className: 'about-updates-item is-shown about-default-update-message'},
          this.props.updateManager.getAutoUpdatesEnabled() ? 'Atom will check for updates automatically' : 'Automatic updates are disabled please check manually'
        )
        break
      case UpdateManager.State.CheckingForUpdate:
        updateStatus = $.div({className: 'about-updates-item app-checking-for-updates'},
          $.span({className: 'about-updates-label icon icon-search'}, 'Checking for updates...')
        )
        break
      case UpdateManager.State.DownloadingUpdate:
        updateStatus = $.div({className: 'about-updates-item app-downloading-update'},
          $.span({className: 'loading loading-spinner-tiny inline-block'}),
          $.span({className: 'about-updates-label'}, 'Downloading update')
        )
        break
      case UpdateManager.State.UpdateAvailableToInstall:
        updateStatus = $.div({className: 'about-updates-item app-update-available-to-install'},
          $.span({className: 'about-updates-label icon icon-squirrel'}, 'New update'),
          $.span({className: 'about-updates-version'}, this.props.availableVersion),
          $.a({className: 'about-updates-release-notes', onclick: this.props.viewUpdateReleaseNotes}, 'Release Notes')
        )
        break
      case UpdateManager.State.UpToDate:
        updateStatus = $.div({className: 'about-updates-item app-up-to-date'},
          $.span({className: 'icon icon-check'}),
          $.span({className: 'about-updates-label is-strong'}, 'Atom is up to date!')
        )
        break
      case UpdateManager.State.Unsupported:
        updateStatus = $.div({className: 'about-updates-item app-unsupported'},
          $.span({className: 'about-updates-label is-strong'}, 'Your system does not support automatic updates'),
          $.a({className: 'about-updates-instructions', onclick: this.props.viewUpdateInstructions}, 'How to update')
        )
        break
      case UpdateManager.State.Error:
        updateStatus = $.div({className: 'about-updates-item app-update-error'},
          $.span({className: 'icon icon-x'}),
          $.span({className: 'about-updates-label app-error-message is-strong'}, this.props.updateManager.getErrorMessage())
        )
        break
    }

    return updateStatus
  }

  render () {
    return $.div({className: 'about-updates group-start'},
      $.div({className: 'about-updates-box'},
        $.div({className: 'about-updates-status'}, this.renderUpdateStatus()),
        $.button(
          {
            className: 'btn about-update-action-button',
            disabled: this.shouldUpdateActionButtonBeDisabled(),
            onclick: this.executeUpdateAction.bind(this),
            style: {
              display: this.props.updateManager.state === UpdateManager.State.Unsupported ? 'none' : 'block'
            }
          },
          this.props.updateManager.state === 'update-available' ? 'Restart and install' : 'Check now'
        )
      ),
      $.div(
        {
          className: 'about-auto-updates',
          style: {
            display: this.props.updateManager.state === UpdateManager.State.Unsupported ? 'none' : 'block'
          }
        },
        $.label({},
          $.input(
            {
              className: 'input-checkbox',
              type: 'checkbox',
              checked: this.props.updateManager.getAutoUpdatesEnabled(),
              onchange: this.handleAutoUpdateCheckbox.bind(this)
            }
          ),
          $.span({}, 'Automatically download updates')
        )
      )
    )
  }
}
