(function($) {
  $.fn.accordionFutura = function(options) {
    var settings = $.extend(
      {
        onlyOneActive: true, // True: Abre um e fecha os outros elementos
        initFirstActive: true, // True: Deixa o primeiro elemento aberto
        destructor: false, // True: Cancela o accordion. Ex. de uso: Accordion funciona no mobile e no desktop não
        hideControl: false, // True: Desaparece com os controles. Obs.: Apenas se o parametro destructor for true
        openNextOnClose: false, // True: Ao clicar no controle ativo fecha o conteúdo atual e abre o próximo.
        form: false, // formulário para validação dividida em steps
      },
      options
    );

    return this.each(function() {
      var $this = $(this),
        $control = $('.js-accordion-content', $this).prev('.js-accordion-control'),
        $content = $('.js-accordion-content', $this),
        clickOnActive = false;

      if (settings.destructor) {
        $control.off('click').removeClass('active');
        if (settings.hideControl) {
          $control.css('display', 'none');
        }
        $content.css('display', 'block');
        $this.data('status', false);
        return;
      } else {
        if ($this.data('status') == true) {
          // Verifica se o plugin já foi rodado
          return;
        }
      }

      $this.data('status', true);

      $control.css('display', 'block');
      $content.css('display', 'none');

      if (settings.initFirstActive) {
        $control.filter(':first').addClass('active');
      }

      slideActive();

      $control.on('click', function(e) {
        e.preventDefault();
        $this = $(this);

        if (settings.form && $this.index() >= $('.js-accordion-control.active').index()) {
          var valid = settings.form.valid();
          if (!valid) {
            notificationMsg('Alguns campos estão incorretos! Corrija antes de prosseguir.', 'error');
            return;
          }
        }

        if ($this.hasClass('active')) {
          clickOnActive = true;
          if (settings.openNextOnClose) {
            $this
              .parent()
              .find('.js-accordion-control')
              .each(function() {
                if ($(this).index() > $this.index()) {
                  $(this).addClass('active');
                  return false;
                }
              });
          }
          $this.removeClass('active');
        } else {
          if (settings.onlyOneActive) {
            $control.removeClass('active');
          }
          $this.addClass('active');
        }

        slideActive();
      });

      function slideActive() {
        $control
          .filter('.active')
          .next('.js-accordion-content')
          .stop(false, true)
          .slideDown(400, function() {
            if (settings.openNextOnClose && clickOnActive) {
              $('body, html')
                .stop(false, true)
                .animate(
                  {
                    scrollTop:
                      $('.js-accordion-control.active').offset().top -
                      $('.js-accordion-control:eq(0)').outerHeight() -
                      15,
                  },
                  400
                );
            }
          });
        $control
          .filter(':not(.active)')
          .next('.js-accordion-content')
          .stop(false, true)
          .slideUp();
      }
    });
  };
})(jQuery);
