import axios from 'axios';
import { createFile } from './files';
import { TEXT_FILE_REGEX } from '../../../../server/utils/fileUtils';

const __process = (typeof global !== 'undefined' ? global : window).process;
const s3BucketHttps = __process.env.S3_BUCKET_URL_BASE ||
                      `https://s3-${__process.env.AWS_REGION}.amazonaws.com/${__process.env.S3_BUCKET}/`;
const ROOT_URL = __process.env.API_URL;
const MAX_LOCAL_FILE_SIZE = 80000; // bytes, aka 80 KB

function localIntercept(file, options = {}) {
  return new Promise((resolve, reject) => {
    if (!options.readType) {
      // const mime = file.type;
      // const textType = a(_textTypes).any(type => {
      //   const re = new RegExp(type);
      //   return re.test(mime);
      // });
      // options.readType = textType ? 'readAsText' : 'readAsDataURL';
      options.readType = 'readAsText'; // eslint-disable-line
    }
    const reader = new window.FileReader();
    reader.onload = () => {
      resolve(reader.result);
    };
    reader.onerror = () => {
      reject(reader.result);
    };

    // run the reader
    reader[options.readType](file);
  });
}

export function dropzoneAcceptCallback(userId, file, done) {
  return () => {
    // if a user would want to edit this file as text, local interceptor
    if (file.name.match(TEXT_FILE_REGEX) && file.size < MAX_LOCAL_FILE_SIZE) {
      localIntercept(file).then((result) => {
        file.content = result; // eslint-disable-line
        done('Uploading plaintext file locally.');
      })
        .catch((result) => {
          done(`Failed to download file ${file.name}: ${result}`);
          console.warn(file);
        });
    } else {
      file.postData = []; // eslint-disable-line
      axios.post(
        `${ROOT_URL}/S3/sign`, {
          name: file.name,
          type: file.type,
          size: file.size,
          userId
        // _csrf: document.getElementById('__createPostToken').value
        },
        {
          withCredentials: true
        }
      )
        .then((response) => {
          file.custom_status = 'ready'; // eslint-disable-line
          file.postData = response.data; // eslint-disable-line
          file.s3 = response.data.key; // eslint-disable-line
          file.previewTemplate.className += ' uploading'; // eslint-disable-line
          done();
        })
        .catch((response) => {
          file.custom_status = 'rejected'; // eslint-disable-line
          if (response.data && response.data.responseText && response.data.responseText.message) {
            done(response.data.responseText.message);
          }
          done('Error: Reached upload limit.');
        });
    }
  };
}

export function dropzoneSendingCallback(file, xhr, formData) {
  return () => {
    if (!file.name.match(TEXT_FILE_REGEX) || file.size >= MAX_LOCAL_FILE_SIZE) {
      Object.keys(file.postData).forEach((key) => {
        formData.append(key, file.postData[key]);
      });
      formData.append('Content-type', file.type);
      formData.append('Content-length', '');
      formData.append('acl', 'public-read');
    }
  };
}

export function dropzoneCompleteCallback(file) {
  return (dispatch, getState) => { // eslint-disable-line
    if ((!file.name.match(TEXT_FILE_REGEX) || file.size >= MAX_LOCAL_FILE_SIZE) && file.status !== 'error') {
      let inputHidden = '<input type="hidden" name="attachments[]" value="';
      const json = {
        url: `${s3BucketHttps}${file.postData.key}`,
        originalFilename: file.name
      };
      // console.log(json, JSON.stringify(json), JSON.stringify(json).replace('"', '\\"'));
      inputHidden += `${window.btoa(JSON.stringify(json))}" />`;
      // document.getElementById('uploader').appendChild(inputHidden);
      document.getElementById('uploader').innerHTML += inputHidden;

      const formParams = {
        name: file.name,
        url: `${s3BucketHttps}${file.postData.key}`
      };
      createFile(formParams)(dispatch, getState);
    } else if (file.content !== undefined) {
      const formParams = {
        name: file.name,
        content: file.content
      };
      createFile(formParams)(dispatch, getState);
    }
  };
}