class SupportController < ApplicationController
  def index
    setup_context
  end

  def admin
    setup_context_admin
  end

  def create
    if direct_message? && create_commentaire
      flash.notice = "Votre message a été envoyé sur la messagerie de votre dossier."

      redirect_to messagerie_dossier_path(dossier)
    elsif create_conversation
      flash.notice = "Votre message a été envoyé."

      if params[:admin]
        redirect_to root_path(formulaire_contact_admin_submitted: true)
      else
        redirect_to root_path(formulaire_contact_general_submitted: true)
      end
    else
      flash.now.alert = "Une erreur est survenue. Vous pouvez nous contacter à #{helpers.mail_to(CONTACT_EMAIL)}."

      if params[:admin]
        setup_context_admin
        render :admin
      else
        setup_context
        render :index
      end
    end
  end

  private

  def setup_context
    @dossier_id = dossier&.id
    @tags = tags
    @options = Helpscout::FormAdapter.options
  end

  def setup_context_admin
    @tags = tags
    @options = Helpscout::FormAdapter.admin_options
  end

  def create_conversation
    Helpscout::FormAdapter.new(
      subject: params[:subject],
      email: email,
      phone: params[:phone],
      text: params[:text],
      file: params[:piece_jointe],
      dossier_id: dossier&.id,
      browser: browser_name,
      tags: tags
    ).send_form
  end

  def create_commentaire
    attributes = {
      piece_jointe: params[:piece_jointe],
      body: "[#{params[:subject]}]<br><br>#{params[:text]}"
    }
    commentaire = CommentaireService.build(current_user, dossier, attributes)
    commentaire.save!
  end

  def tags
    [params[:tags], params[:type]].flatten.compact
      .map { |tag| tag.split(',') }
      .flatten
      .reject(&:blank?).uniq
  end

  def browser_name
    if browser.known?
      "#{browser.name} #{browser.version} (#{browser.platform.name})"
    end
  end

  def direct_message?
    user_signed_in? && params[:type] == Helpscout::FormAdapter::TYPE_INSTRUCTION && dossier.present? && dossier.messagerie_available?
  end

  def dossier
    @dossier ||= current_user&.dossiers&.find_by(id: params[:dossier_id])
  end

  def email
    current_user&.email || params[:email]
  end
end