import Ember from 'ember';

const { set } = Ember;
const BASE_64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gi;

export default Ember.Component.extend({
  classNames: ['box', 'is-fullwidth', 'is-marginless', 'is-shadowless'],
  key: null,
  index: null,
  onChange: () => {},

  /*
   * @public
   * @param String
   * Text to use as the label for the file input
   * If null, a default will be rendered
   */
  label: null,

  /*
   * @public
   * @param String
   * Text to use as help under the file input
   * If null, a default will be rendered
   */
  fileHelpText: null,

  /*
   * @public
   * @param String
   * Text to use as help under the textarea in text-input mode
   * If null, a default will be rendered
   */
  textareaHelpText: null,

  readFile(file) {
    const reader = new FileReader();
    reader.onload = () => this.setPGPKey(reader.result, file.name);
    // this gives us a base64-encoded string which is important in the onload
    reader.readAsDataURL(file);
  },

  setPGPKey(dataURL, filename) {
    const b64File = dataURL.split(',')[1].trim();
    const decoded = atob(b64File).trim();

    // If a b64-encoded file was uploaded, then after decoding, it
    // will still be b64.
    // If after decoding it's not b64, we want
    // the original as it was only encoded when we used `readAsDataURL`.
    const fileData = decoded.match(BASE_64_REGEX) ? decoded : b64File;
    this.get('onChange')(this.get('index'), { value: fileData, fileName: filename });
  },

  actions: {
    pickedFile(e) {
      const { files } = e.target;
      if (!files.length) {
        return;
      }
      for (let i = 0, len = files.length; i < len; i++) {
        this.readFile(files[i]);
      }
    },
    updateData(e) {
      const key = this.get('key');
      set(key, 'value', e.target.value);
      this.get('onChange')(this.get('index'), this.get('key'));
    },
    clearKey() {
      this.get('onChange')(this.get('index'), { value: '' });
    },
  },
});
