module SettingConcern
  extend ActiveSupport::Concern

  included do
    before_action :login_required
    before_action :find_fluentd
    helper_method :target_plugin_name, :plugin_setting_form_action_url
  end


  def show
    @setting = target_class.new(initial_params)
    @buffer = @setting.create_buffer
    @storage = @setting.create_storage
    @parser = @setting.create_parser
    @formatter = @setting.create_formatter
    render "shared/settings/show"
  end

  def finish
    @setting = target_class.new(setting_params)
    unless @setting.valid?
      return render "shared/settings/show"
    end

    @fluentd.agent.config_merge(@setting.to_config.to_s)
    if @fluentd.agent.running?
      unless @fluentd.agent.restart
        @setting.errors.add(:base, @fluentd.agent.log.tail(1).first)
        return render "shared/settings/show"
      end
    end
    redirect_to daemon_setting_path(@fluentd)
  end

  private

  def setting_params
    params.require(:setting).permit(*target_class.permit_params)
  end

  def initial_params
    target_class.initial_params
  end

  def target_plugin_name
    prefix = case target_class.plugin_type
             when "input"
               "in"
             when "output"
               "out"
             else
               target_class.plugin_type
             end
    "#{prefix}_#{target_class.plugin_name}"
  end

  def plugin_setting_form_action_url(*args)
    send("finish_daemon_setting_#{target_plugin_name}_path", *args)
  end
end
