# frozen_string_literal: true
class CustomWizard::AdminWizardController < CustomWizard::AdminController
  before_action :find_wizard, only: %i[show remove]
  requires_plugin "discourse-custom-wizard"

  def index
    render_json_dump(
      wizard_list:
        ActiveModel::ArraySerializer.new(
          CustomWizard::Wizard.list(current_user),
          each_serializer: CustomWizard::BasicWizardSerializer,
        ),
      field_types: CustomWizard::Field.types,
      realtime_validations: CustomWizard::RealtimeValidation.types,
      custom_fields: custom_field_list,
    )
  end

  def show
    params.require(:wizard_id)

    if data = CustomWizard::Template.find(params[:wizard_id].underscore)
      render json: data.as_json
    else
      render json: { none: true }
    end
  end

  def remove
    if CustomWizard::Template.remove(@wizard.id)
      render json: success_json
    else
      render json: failed_json
    end
  end

  def save
    template = CustomWizard::Template.new(save_wizard_params.to_h)
    wizard_id = template.save(create: params[:create])

    if template.errors.any?
      render json:
               failed_json.merge(
                 backend_validation_error: template.errors.full_messages.join("\n\n"),
               )
    else
      render json: success_json.merge(wizard_id: wizard_id)
    end
  end

  private

  def mapped_params
    [
      :type,
      :connector,
      :output,
      :output_type,
      :output_connector,
      pairs: [:index, :key, :key_type, :value, :value_type, :connector, value: [], key: []],
      output: [],
    ]
  end

  def save_wizard_params
    params.require(:wizard).permit(
      :id,
      :name,
      :background,
      :save_submissions,
      :multiple_submissions,
      :after_signup,
      :after_time,
      :after_time_scheduled,
      :required,
      :prompt_completion,
      :restart_on_revisit,
      :resume_on_revisit,
      :theme_id,
      permitted: mapped_params,
      after_time_groups: [],
      steps: [
        :id,
        :index,
        :title,
        :key,
        :banner,
        :banner_upload_id,
        :raw_description,
        :required_data_message,
        :force_final,
        required_data: mapped_params,
        permitted_params: mapped_params,
        condition: mapped_params,
        fields: [
          :id,
          :index,
          :label,
          :image,
          :image_upload_id,
          :description,
          :required,
          :key,
          :type,
          :min_length,
          :max_length,
          :char_counter,
          :file_types,
          :format,
          :limit,
          :property,
          :preview_template,
          :placeholder,
          :can_create_tag,
          :category,
          prefill: mapped_params,
          content: mapped_params,
          condition: mapped_params,
          index: mapped_params,
          validations: {
          },
          tag_groups: [],
        ],
      ],
      actions: [
        :id,
        :run_after,
        :type,
        :code,
        :skip_redirect,
        :suppress_notifications,
        :post,
        :post_builder,
        :post_template,
        :notification_level,
        :api,
        :api_endpoint,
        :api_body,
        :wizard_user,
        title: mapped_params,
        category: mapped_params,
        tags: mapped_params,
        custom_fields: mapped_params,
        visible: mapped_params,
        required: mapped_params,
        poster: mapped_params,
        guest_email: mapped_params,
        recipient: mapped_params,
        categories: mapped_params,
        mute_remainder: mapped_params,
        profile_updates: mapped_params,
        group: mapped_params,
        url: mapped_params,
        name: mapped_params,
        slug: mapped_params,
        color: mapped_params,
        text_color: mapped_params,
        parent_category_id: mapped_params,
        permissions: mapped_params,
        full_name: mapped_params,
        bio_raw: mapped_params,
        usernames: mapped_params,
        owner_usernames: mapped_params,
        grant_trust_level: mapped_params,
        mentionable_level: mapped_params,
        messageable_level: mapped_params,
        visibility_level: mapped_params,
        members_visibility_level: mapped_params,
        add_event: mapped_params,
        add_location: mapped_params,
      ],
    )
  end
end
