# frozen_string_literal: true

describe CustomWizard::AdminManagerController do
  fab!(:admin_user) { Fabricate(:user, admin: true) }
  let(:template) { get_wizard_fixture("wizard") }

  before do
    sign_in(admin_user)

    template_2 = template.dup
    template_2["id"] = "super_mega_fun_wizard_2"
    template_3 = template.dup
    template_3["id"] = "super_mega_fun_wizard_3"
    @template_array = [template, template_2, template_3]

    FileUtils.mkdir_p(concurrency_safe_tmp_dir) unless Dir.exist?(concurrency_safe_tmp_dir)
    @tmp_file_path = File.join(concurrency_safe_tmp_dir, SecureRandom.hex << "wizards.json")
    File.write(@tmp_file_path, @template_array.to_json)
  end

  it "exports all the wizard templates" do
    @template_array.each { |template| CustomWizard::Template.save(template, skip_jobs: true) }

    get "/admin/wizards/manager/export.json",
        params: {
          wizard_ids: %w[super_mega_fun_wizard super_mega_fun_wizard_2 super_mega_fun_wizard_3],
        }

    expect(response.status).to eq(200)
    expect(response.parsed_body).to match_array(@template_array)
  end

  context "import" do
    it "works" do
      templates = @template_array.map { |t| t.slice("id", "name") }

      post "/admin/wizards/manager/import.json",
           params: {
             file: fixture_file_upload(File.open(@tmp_file_path)),
           }

      expect(response.status).to eq(200)
      expect(response.parsed_body["imported"]).to match_array(templates)
      expect(CustomWizard::Template.list.map { |t| t.slice("id", "name") }).to match_array(
        templates,
      )
    end

    it "rejects a template with the same id as a saved template" do
      templates = @template_array.map { |t| t.slice("id", "name") }

      post "/admin/wizards/manager/import.json",
           params: {
             file: fixture_file_upload(File.open(@tmp_file_path)),
           }

      expect(response.status).to eq(200)
      expect(response.parsed_body["imported"]).to match_array(templates)

      post "/admin/wizards/manager/import.json",
           params: {
             file: fixture_file_upload(File.open(@tmp_file_path)),
           }

      expect(response.status).to eq(200)
      expect(response.parsed_body["failures"]).to match_array(
        @template_array.map do |t|
          {
            id: t["id"],
            messages: I18n.t("wizard.validation.conflict", wizard_id: t["id"]),
          }.as_json
        end,
      )
    end
  end

  it "destroys wizard templates" do
    templates = @template_array.map { |t| t.slice("id", "name") }

    @template_array.each { |template| CustomWizard::Template.save(template, skip_jobs: true) }

    delete "/admin/wizards/manager/destroy.json",
           params: {
             wizard_ids: %w[super_mega_fun_wizard super_mega_fun_wizard_2 super_mega_fun_wizard_3],
           }

    expect(response.status).to eq(200)
    expect(response.parsed_body["destroyed"]).to match_array(templates)
    expect(CustomWizard::Template.list.length).to eq(0)
  end
end
