# frozen_string_literal: true
class CustomWizard::AdminManagerController < CustomWizard::AdminController
  skip_before_action :check_xhr, only: [:export]
  before_action :get_wizard_ids, except: [:import]

  def export
    templates = []

    @wizard_ids.each do |wizard_id|
      if template = CustomWizard::Template.find(wizard_id)
        templates.push(template)
      end
    end

    if templates.empty?
      return render_error(I18n.t('wizard.export.error.invalid_wizards'))
    end

    basename = SiteSetting.title.parameterize || 'discourse'
    time = Time.now.to_i
    filename = "#{basename}-wizards-#{time}.json"

    send_data templates.to_json,
      type: "application/json",
      disposition: 'attachment',
      filename: filename
  end

  def import
    file = File.read(params['file'].tempfile)

    if file.nil?
      return render_error(I18n.t('wizard.export.error.no_file'))
    end

    file_size = file.size
    max_file_size = 512 * 1024

    if max_file_size < file_size
      return render_error(I18n.t('wizard.import.error.file_large'))
    end

    begin
      template_json = JSON.parse(file)
    rescue JSON::ParserError
      return render_error(I18n.t('wizard.import.error.invalid_json'))
    end

    imported = []
    failures = []
    templates = template_json.is_a?(Array) ? template_json : [template_json]

    templates.each do |raw_template|
      template = CustomWizard::Template.new(raw_template)
      template.save(skip_jobs: true, create: true)

      if template.errors.any?
        failures.push(
          id: template.data['id'],
          messages: template.errors.full_messages.join(', ')
        )
      else
        imported.push(
          id: template.data['id'],
          name: template.data['name']
        )
      end
    end

    render json: success_json.merge(
      imported: imported,
      failures: failures
    )
  end

  def destroy
    destroyed = []
    failures = []

    @wizard_ids.each do |wizard_id|
      template = CustomWizard::Template.find(wizard_id)

      if template && CustomWizard::Template.remove(wizard_id)
        destroyed.push(
          id: wizard_id,
          name: template['name']
        )
      else
        failures.push(
          id: wizard_id,
          messages: I18n.t("wizard.destroy.error.#{template ? 'default' : 'no_template'}")
        )
      end
    end

    render json: success_json.merge(
      destroyed: destroyed,
      failures: failures
    )
  end

  private

  def get_wizard_ids
    if params['wizard_ids'].blank?
      return render_error(I18n.t('wizard.export.error.select_one'))
    end

    wizard_ids = []

    params['wizard_ids'].each do |wizard_id|
      begin
        wizard_ids.push(wizard_id.underscore)
      rescue
        #
      end
    end

    if wizard_ids.empty?
      return render_error(I18n.t('wizard.export.error.invalid_wizards'))
    end

    @wizard_ids = wizard_ids
  end
end
