import ProgressBar from './progress-bar';
import {
  errorFromDirectUploadMessage,
  ERROR_CODE_READ,
  FAILURE_CLIENT
} from './file-upload-error';
import { fire } from '@utils';

const INITIALIZE_EVENT = 'direct-upload:initialize';
const START_EVENT = 'direct-upload:start';
const PROGRESS_EVENT = 'direct-upload:progress';
const ERROR_EVENT = 'direct-upload:error';
const END_EVENT = 'direct-upload:end';

function addUploadEventListener(type, handler) {
  addEventListener(type, (event) => {
    // Internet Explorer and Edge will sometime replay Javascript events
    // that were dispatched just before a page navigation (!), but without
    // the event payload.
    //
    // Ignore these replayed events.
    const isEventValid = event && event.detail && event.detail.id != undefined;
    if (!isEventValid) return;

    handler(event);
  });
}

addUploadEventListener(INITIALIZE_EVENT, ({ target, detail: { id, file } }) => {
  ProgressBar.init(target, id, file);
});

addUploadEventListener(START_EVENT, ({ target, detail: { id } }) => {
  ProgressBar.start(id);
  // At the end of the upload, the form will be submitted again.
  // Avoid the confirm dialog to be presented again then.
  const button = target.form.querySelector('button.primary');
  if (button) {
    button.removeAttribute('data-confirm');
  }
});

addUploadEventListener(PROGRESS_EVENT, ({ detail: { id, progress } }) => {
  ProgressBar.progress(id, progress);
});

addUploadEventListener(ERROR_EVENT, (event) => {
  let id = event.detail.id;
  let errorMsg = event.detail.error;

  // Display an error message
  alert(
    `Nous sommes désolés, une erreur s’est produite lors de l’envoi du fichier.

    (${errorMsg})`
  );
  // Prevent ActiveStorage from displaying its own error message
  event.preventDefault();

  ProgressBar.error(id, errorMsg);

  // Report unexpected client errors to Sentry.
  // (But ignore usual client errors, or errors we can monitor better on the server side.)
  let error = errorFromDirectUploadMessage(errorMsg);
  if (error.failureReason == FAILURE_CLIENT && error.code != ERROR_CODE_READ) {
    fire(document, 'sentry:capture-exception', error);
  }
});

addUploadEventListener(END_EVENT, ({ detail: { id } }) => {
  ProgressBar.end(id);
});