module ApplicationHelper
  include SanitizeUrl

  def sanitize_url(url)
    if !url.nil?
      super(url, schemes: ['http', 'https'], replace_evil_with: root_url)
    end
  end

  def flash_class(level, sticky = false)
    case level
    when "notice" then "alert-success#{sticky ? ' sticky' : ''}"
    when "alert" then "alert-danger#{sticky ? ' sticky' : ''}"
    end
  end

  def render_to_element(selector, partial:, outer: false, locals: {})
    method = outer ? 'outerHTML' : 'innerHTML'
    html = escape_javascript(render partial: partial, locals: locals)
    # rubocop:disable Rails/OutputSafety
    raw("document.querySelector('#{selector}').#{method} = \"#{html}\";")
    # rubocop:enable Rails/OutputSafety
  end

  def render_flash(timeout: false, sticky: false)
    if flash.any?
      html = render_to_element('#flash_messages', partial: 'layouts/flash_messages', locals: { sticky: sticky }, outer: true)
      flash.clear
      if timeout
        html += remove_element('#flash_messages', timeout: timeout, inner: true)
      end
      html
    end
  end

  def remove_element(selector, timeout: 0, inner: false)
    script = "(function() {";
    script << "var el = document.querySelector('#{selector}');"
    method = (inner ? "el.innerHTML = ''" : "el.parentNode.removeChild(el)")
    script << "setTimeout(function() { #{method}; }, #{timeout});";
    script << "})();"
    # rubocop:disable Rails/OutputSafety
    raw(script);
    # rubocop:enable Rails/OutputSafety
  end

  def current_email
    current_user&.email ||
      current_gestionnaire&.email ||
      current_administrateur&.email
  end

  def staging?
    ENV['APP_NAME'] == 'tps_dev'
  end

  def root_path_for_profile(nav_bar_profile)
    case nav_bar_profile
    when :gestionnaire
      gestionnaire_procedures_path
    when :user
      dossiers_path
    else
      root_path
    end
  end

  def ensure_safe_json(json)
    JSON.parse(json).to_json
  rescue Exception => e
    Raven.capture_exception(e)
    {}
  end

  def sentry_config
    sentry = Rails.application.secrets.sentry
    if sentry
      {
        dsn: sentry[:browser],
        id: current_user&.id,
        email: current_email
      }.to_json
    else
      {}
    end
  end
end
