const SelectListView = require('atom-select-list')
const { repositoryForPath } = require('./helpers')

module.exports = class DiffListView {
  constructor () {
    this.selectListView = new SelectListView({
      emptyMessage: 'No diffs in file',
      items: [],
      filterKeyForItem: diff => diff.lineText,
      elementForItem: diff => {
        const li = document.createElement('li')
        li.classList.add('two-lines')

        const primaryLine = document.createElement('div')
        primaryLine.classList.add('primary-line')
        primaryLine.textContent = diff.lineText
        li.appendChild(primaryLine)

        const secondaryLine = document.createElement('div')
        secondaryLine.classList.add('secondary-line')
        secondaryLine.textContent = `-${diff.oldStart},${diff.oldLines} +${
          diff.newStart
        },${diff.newLines}`
        li.appendChild(secondaryLine)

        return li
      },
      didConfirmSelection: diff => {
        this.cancel()
        const bufferRow = diff.newStart > 0 ? diff.newStart - 1 : diff.newStart
        this.editor.setCursorBufferPosition([bufferRow, 0], {
          autoscroll: true
        })
        this.editor.moveToFirstCharacterOfLine()
      },
      didCancelSelection: () => {
        this.cancel()
      }
    })
    this.selectListView.element.classList.add('diff-list-view')
    this.panel = atom.workspace.addModalPanel({
      item: this.selectListView,
      visible: false
    })
  }

  attach () {
    this.previouslyFocusedElement = document.activeElement
    this.selectListView.reset()
    this.panel.show()
    this.selectListView.focus()
  }

  cancel () {
    this.panel.hide()
    if (this.previouslyFocusedElement) {
      this.previouslyFocusedElement.focus()
      this.previouslyFocusedElement = null
    }
  }

  destroy () {
    this.cancel()
    this.panel.destroy()
    return this.selectListView.destroy()
  }

  async toggle () {
    const editor = atom.workspace.getActiveTextEditor()
    if (this.panel.isVisible()) {
      this.cancel()
    } else if (editor) {
      this.editor = editor
      const repository = repositoryForPath(this.editor.getPath())
      let diffs = repository
        ? repository.getLineDiffs(this.editor.getPath(), this.editor.getText())
        : []
      if (!diffs) diffs = []
      for (let diff of diffs) {
        const bufferRow = diff.newStart > 0 ? diff.newStart - 1 : diff.newStart
        const lineText = this.editor.lineTextForBufferRow(bufferRow)
        diff.lineText = lineText ? lineText.trim() : ''
      }

      await this.selectListView.update({ items: diffs })
      this.attach()
    }
  }
}
