import { actionable } from '@github/catalyst/lib/actionable'
import { target, targetable } from '@github/catalyst/lib/targetable'
import { convertImagesInInput } from './convert_upload'

export default actionable(targetable(class extends HTMLElement {
  static [target.static] = [
    'loading',
    'icon',
    'input',
    'area'
  ]

  connectedCallback () {
    this.addEventListener('dragover', (e) => e.preventDefault())
    this.addEventListener('drop', this.onDrop)
    document.addEventListener('turbo:submit-end', this.toggleLoading)
    this.area?.addEventListener('dragover', this.onDragover)
    this.area?.addEventListener('dragleave', this.onDragleave)
  }

  disconnectedCallback () {
    this.removeEventListener('drop', this.onDrop)
    document.removeEventListener('turbo:submit-end', this.toggleLoading)
    this.area?.removeEventListener('dragover', this.onDragover)
    this.area?.removeEventListener('dragleave', this.onDragleave)
  }

  onDragover (e) {
    if (e.dataTransfer?.types?.includes('Files')) {
      this.style.backgroundColor = '#F7F3F0'
      this.classList.remove('border-base-300', 'hover:bg-base-200/30')
      this.classList.add('border-base-content/30')
    }
  }

  onDragleave () {
    this.style.backgroundColor = null
    this.classList.remove('border-base-content/30')
    this.classList.add('border-base-300', 'hover:bg-base-200/30')
  }

  async onDrop (e) {
    e.preventDefault()

    this.input.files = e.dataTransfer.files

    await convertImagesInInput(this.input)

    this.uploadFiles(this.input.files)
  }

  async onSelectFiles (e) {
    e.preventDefault()

    await convertImagesInInput(this.input)

    this.uploadFiles(this.input.files)
  }

  toggleLoading = (e) => {
    if (e && e.target && (!e.target.contains(this) || !e.detail?.formSubmission?.formElement?.contains(this))) {
      return
    }

    this.loading.classList.toggle('hidden')
    this.icon.classList.toggle('hidden')
    this.classList.toggle('opacity-50')
  }

  uploadFiles () {
    this.toggleLoading()

    if (this.dataset.submitOnUpload) {
      this.closest('form').querySelector('button[type="submit"]').click()
    }
  }
}))
