const html = require('choo/html');
const assets = require('../../../common/assets');
const title = require('../../templates/title');
const setPasswordSection = require('../../templates/setPasswordSection');
const uploadBox = require('../../templates/uploadedFileList');
const expireInfo = require('../../templates/expireInfo');

module.exports = function(state, emit) {
  // the page flickers if both the server and browser set 'effect--fadeIn'
  const fade = state.layout ? '' : 'effect--fadeIn';

  const hasAnUpload = state.archive && state.archive.numFiles > 0;

  const optionClass = state.uploading ? 'uploadOptions--faded' : '';
  const btnUploading = state.uploading ? 'btn--stripes' : '';
  const cancelVisible = state.uploading ? '' : 'noDisplay';
  const faded = hasAnUpload ? 'uploadArea--faded' : '';
  const selectFileClass = hasAnUpload > 0 ? 'btn--hidden' : '';
  const sendFileClass = hasAnUpload > 0 ? '' : 'btn--hidden';

  let btnText = '';

  if (state.encrypting) {
    btnText = state.translate('encryptingFile');
  } else if (state.uploading) {
    btnText = `sending...  ${Math.floor(state.transfer.progressRatio * 100)}%`;
  } else {
    //default pre-upload text
    btnText = state.translate('uploadSuccessConfirmHeader');
  }

  return html`
  <div id="page-one" class="page ${fade}">
    ${title(state)}

    <label class="uploadArea"

      ondragover=${dragover}
      ondragleave=${dragleave}>

      ${uploadBox(state.archive, state, emit)}

      <div class="uploadedFilesWrapper ${faded}">
        <img
          class="uploadArea__icon"
          src="${assets.get('addfile.svg')}"
          title="${state.translate('uploadSvgAlt')}"/>
        <div class="uploadArea__msg">
          ${state.translate('uploadDropDragMessage')}
        </div>

        <span class="uploadArea__clickMsg">
          ${state.translate('uploadDropClickMessage')}
        </span>
      </div>

      <input id="file-upload"
        class="inputFile fileBox"
        type="file"
        multiple
        name="fileUploaded"
        onfocus=${onfocus}
        onblur=${onblur}
        onchange=${addFiles} />

    </label>

    <div class="uploadOptions ${optionClass}">
    ${expireInfo(state, emit)}
    ${setPasswordSection(state)}
    </div>

    <label for="file-upload"
      class="btn btn--file ${selectFileClass}"
      title="${state.translate('uploadPageBrowseButton1')}">
      ${state.translate('uploadPageBrowseButton1')}
    </label>

    <button
      class="btn ${btnUploading} ${sendFileClass}"
      onclick=${state.uploading ? noop : upload}
      title="${btnText}">
      ${btnText}
    </button>

    <button class="btn--cancel uploadCancel ${cancelVisible}"
      onclick=${cancel}>
      ${state.translate('uploadingPageCancel')}
    </button>

  </div>
  `;

  function noop() {}

  function dragover(event) {
    const div = document.querySelector('.uploadArea');
    div.classList.add('uploadArea--dragging');
  }

  function dragleave(event) {
    const div = document.querySelector('.uploadArea');
    div.classList.remove('uploadArea--dragging');
  }

  function onfocus(event) {
    event.target.classList.add('inputFile--focused');
  }

  function onblur(event) {
    event.target.classList.remove('inputFile--focused');
  }

  function cancel(event) {
    if (state.uploading) {
      emit('cancel');
      const cancelBtn = document.querySelector('.uploadCancel');
      cancelBtn.innerHTML = state.translate('uploadCancelNotification');
    }
  }

  function addFiles(event) {
    event.preventDefault();
    const newFiles = Array.from(event.target.files);

    emit('addFiles', { files: newFiles });
  }

  function upload(event) {
    event.preventDefault();
    event.target.disabled = true;
    if (!state.uploading) {
      emit('upload', {
        type: 'click',
        dlimit: state.downloadCount || 1,
        password: state.password
      });
    }
  }
};