/**
 * francetransfert.js
 * 
 * Permet la détection de la taille des pièces jointes pour savoir si le message
 * doit être envoyé par France Transfert ou non
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License version 2 as published by the
 * Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 */

// Variables globales
var timer;
var total_size = 0;
var ft_error_timeout = 300000;

$(document).ready(function() {
  // binds to click event of your input send button
  $("#toolbar-menu a.send").bind('click', function(event) {
    var lock = rcmail.display_message(rcmail.gettext('loading'), 'loading');
    rcmail.http_post('plugin.test_francetransfert', {
      _id : rcmail.env.compose_id
    }, lock);
  });
});

if (window.rcmail) {
  rcmail.addEventListener('init', function(evt) {
    // Supprime le onclick des boutons pour intercepter le click
    $("#toolbar-menu a.send").prop('onclick', null);
  });

  rcmail.addEventListener('actionbefore', function(evt) {
    if (evt.action == 'send-attachment') {
      const formInput = $('#uploadformInput')[0];
      if (formInput.files.length) {
        for (var i=0; i < formInput.files.length; i++) {
          total_size += formInput.files[i].size
          // Supprimer l'appel a l'auto save dans les brouillons pour un message Mélanissimo
          if (total_size > rcmail.env.max_attachments_size) {
            clearTimeout(rcmail.save_timer);
            rcmail.env.draft_autosave = 0;
          }
        }
      }
    }
  });

  rcmail.addEventListener('responseafterplugin.test_francetransfert', function(
      event) {
    // Tester si on est en remise différée
    if (event.response.use_francetransfert && $('#envoi_differe').length && $('#envoi_differe').val()) {
      rcmail.show_popup_dialog(
        rcmail.labels['mel_france_transfert.France Transfert remise differee error'], 
        "",
        [{
          text: rcmail.labels['mel_france_transfert.button send now'],
          'class': 'mainaction',
          click: function() {
            if (send_with_francetransfert(event))
              $(this).dialog('close');
          }
        },
        {
          text: rcmail.get_label('cancel'),
          click: function() {
            $(this).dialog('close');
          }
        }]);
    }
    else {
      send_with_francetransfert(event);
    }
  });

  rcmail.addEventListener('responseafterplugin.send_francetransfert', function(event) {
    if (event.response.success) {
      window.timer = setInterval(() => {
        rcmail.http_post('plugin.update_progressbar', {
          _id : rcmail.env.compose_id
        });
      }, 10000);
      
      // Modifier le libéllé
      $( "#send_francetransfert_dialog .dialog_text" ).text(rcmail.labels['mel_france_transfert.Download files France Transfert message']);
    }
    else {
      rcmail.display_message(
        rcmail.labels['mel_france_transfert.Send France Transfert error']  + ". " + event.response.errorMessage, 
        'error', 
        ft_error_timeout);
      $("#send_francetransfert_dialog").dialog('close');
    }
  });
  
  rcmail.addEventListener('responseafterplugin.update_progressbar', function(event) {
    if (event.response.finish) {
      // Suppression du timer
      clearInterval(timer);
      rcmail.env.is_sent = event.response.success;
      // Gestion du résultat
      if (event.response.success) {
        rcmail.remove_compose_data(rcmail.env.compose_id);
        rcmail.display_message(rcmail.labels['mel_france_transfert.Send France Transfert success'], 'confirmation');
        // Fermer la fenêtre d'envoi après 5sec
        setTimeout(function() {
          rcmail.sent_successfully('confirmation', rcmail.labels['mel_france_transfert.Send France Transfert success']);
        }, 2000);
      }
      else {
        rcmail.display_message(
          rcmail.labels['mel_france_transfert.Send France Transfert error']  + ". " + event.response.current_action, 
          'error', 
          ft_error_timeout);
      }
      // Masquer le gif de loading
      $('#send_francetransfert_dialog .uil-rolling-css').hide();
      // Masquer le dialog après 3sec
      setTimeout(function() {
        $("#send_francetransfert_dialog").dialog('close');
      }, 3000);
    }
    $( "#send_francetransfert_dialog .dialog_text" ).text(event.response.current_action);
  });
}

/**
 * Retour de l'event plugin.send_francetransfert
 */
function send_with_francetransfert(event) {
  // Réponse du serveur : envoie par France Transfert ?
  if (event.response.use_francetransfert) {
    // Est-ce que le service France Transfert est up ?
    if (!event.response.francetransfert_up) {
      rcmail.display_message(
        rcmail.labels['mel_france_transfert.France Transfert service down'] + " Error [" + event.response.httpCode + "] : " + event.response.errorMessage, 
        'error', 
        ft_error_timeout);
    }
    else {
      var buttons = {};
      buttons[rcmail.labels['mel_france_transfert.send_francetransfert']] = function () {
        if (validate_message()) {
          send_francetransfert_message();
        }
        $(this).dialog("close");
      };
      buttons[rcmail.labels['mel_france_transfert.cancel']] = function () {
        $(this).dialog("close");
      };
      $(event.response.dialog_html).dialog({
          modal: true, 
          title: rcmail.labels['mel_france_transfert.Send France Transfert title'], 
          zIndex: 10000, 
          autoOpen: true,
          width: '450px', 
          resizable: false,
          buttons: buttons,
          close: function (event, ui) {
              $(this).remove();
          }
      });
    }      
  }
  // Est-ce qu'on dépasse la limite maximum du service France Transfert ?
  else if (event.response.over_size_francetransfert) {
    rcmail.display_message(
      rcmail.labels['mel_france_transfert.Over size France Transfert error']
        .replace('%%max_francetransfert_size%%', event.response.max_francetransfert_size)
        .replace('%%size%%', event.response.size), 
      'error', 
      ft_error_timeout);
  } 
  // Envoi classique du message
  else {
    return rcmail.command('send', '', this, event);
  }
}

function francetransfert_get_compose_message_text() {
  var msg;

  if (window.tinyMCE && (ed = tinyMCE.get(rcmail.env.composebody))) {
    msg = ed.getContent({ format: 'text' });
    msg = msg.replace(/<blockquote[^>]*>(.|[\r\n])*<\/blockquote>/gmi, '');
  }
  else {
    msg = $('#' + rcmail.env.composebody).val();
    msg = msg.replace(/^>.*$/gmi, '');
  }

  return msg;
};

/**
 * Envoi du message via le service France Transfert (appel Ajax)
 */
function send_francetransfert_message() {
  // MANTIS 0005303: Problème de délai dépassé dans la requête
  rcmail.env.request_timeout = 1800;

  // set jQuery ajax options
  $.ajaxSetup({
    timeout: rcmail.env.request_timeout * 1000
  });
  
  rcmail.http_post('plugin.send_francetransfert', {
    _id : rcmail.env.compose_id,
    _nb_days: $("#use_francetransfert_dialog .dialog_select select option:selected").val(),
    _from: $("select#_from").length ? $("#_from option:selected").val() : $("#_from").val(),
    _to: $('#_to').val(),
    _cc: $('#_cc').val(),
    _bcc: $('#_bcc').val(),
    _draft_id: $('input[name=\'_draft_saveid\']').val(),
    _subject: $('#compose-subject').val(),
    _message: francetransfert_get_compose_message_text(),
  }); 

  var dialog_html = '<div id="send_francetransfert_dialog">';
      dialog_html += '<div class="dialog_title row align-items-center"><span class="col-3"><img alt="Logo République française" src="https://francetransfert.numerique.gouv.fr/assets/logos/republique_francaise_logo.svg"></span><span class="col-6"><img alt="Logo France transfert" src="https://francetransfert.numerique.gouv.fr/assets/logos/france_transfert_logo.svg"></span></div>';
      dialog_html += '<span class="dialog_text">' + rcmail.labels['mel_france_transfert.Send France Transfert message'] + '</span>';
      dialog_html += '<div class="uil-rolling-css"><div>';
      dialog_html += '</div>';
      
  $(dialog_html).dialog({
    modal: true, 
    title: rcmail.labels['mel_france_transfert.Send France Transfert title'], 
    zIndex: 10000, 
    autoOpen: true,
    width: '450px', 
    resizable: false,
    closeOnEscape: false,
    open: function(event, ui) { $(".ui-dialog-titlebar-close", ui.dialog | ui).hide(); },
    close: function (event, ui) {      
      $(this).remove();      
    }
  });
}

/**
 * Validation du message au moment de l'envoi
 * 
 * @returns {Boolean}
 */
function validate_message() {
  var input_to  = $('#_to').val();
  var input_subject = $('#compose-subject').val();
  var input_message = $('#composebody').val();

  // check for empty recipient
  var recipients = input_to;
  if (!rcube_check_email(recipients.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true)) {
    alert(rcmail.get_label('norecipientwarning'));
    return false;
  }
  else if (!input_subject.length) {
    alert(rcmail.get_label('nosubjectwarning'));
    return false;
  }
  else if (!input_message.length) {
    alert(rcmail.get_label('nobodywarning'));
    return false;
  }
  else {
    return true;
  }
}