# frozen_string_literal: true

describe CustomWizard::Template do
  fab!(:user)
  let(:template_json) { get_wizard_fixture("wizard") }
  let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
  fab!(:upload)

  before { CustomWizard::Template.save(template_json, skip_jobs: true) }

  it "saves wizard templates" do
    expect(
      PluginStoreRow.exists?(plugin_name: "custom_wizard", key: "super_mega_fun_wizard"),
    ).to eq(true)
  end

  it "finds wizard templates" do
    expect(CustomWizard::Template.find("super_mega_fun_wizard")["id"]).to eq(
      "super_mega_fun_wizard",
    )
  end

  it "removes wizard templates" do
    CustomWizard::Template.remove("super_mega_fun_wizard")
    expect(CustomWizard::Template.find("super_mega_fun_wizard")).to eq(nil)
  end

  it "removes user wizard redirects if template is removed" do
    user.custom_fields["redirect_to_wizard"] = "super_mega_fun_wizard"
    user.save_custom_fields(true)

    CustomWizard::Template.remove("super_mega_fun_wizard")
    expect(user.reload.custom_fields["redirect_to_wizard"]).to eq(nil)
  end

  it "checks for wizard template existence" do
    expect(CustomWizard::Template.exists?("super_mega_fun_wizard")).to eq(true)
  end

  context "upload references" do
    it "are added if a wizard has a step banner" do
      template_json["steps"][0]["banner"] = upload.url
      template_json["steps"][0]["banner_upload_id"] = upload.id
      CustomWizard::Template.save(template_json, skip_jobs: true)
      wizard_record = CustomWizard::Template.find_record(template_json["id"])
      expect(
        UploadReference.exists?(
          upload_id: upload.id,
          target_type: "PluginStoreRow",
          target_id: wizard_record.id,
        ),
      ).to eq(true)
    end

    it "are added if a wizard has a field image" do
      template_json["steps"][0]["fields"][0]["image"] = upload.url
      template_json["steps"][0]["fields"][0]["image_upload_id"] = upload.id
      CustomWizard::Template.save(template_json, skip_jobs: true)
      wizard_record = CustomWizard::Template.find_record(template_json["id"])
      expect(
        UploadReference.exists?(
          upload_id: upload.id,
          target_type: "PluginStoreRow",
          target_id: wizard_record.id,
        ),
      ).to eq(true)
    end

    it "are removed if a wizard step banner is removed" do
      template_json["steps"][0]["banner"] = upload.url
      template_json["steps"][0]["banner_upload_id"] = upload.id
      CustomWizard::Template.save(template_json, skip_jobs: true)

      template_json["steps"][0]["banner"] = nil
      template_json["steps"][0]["banner_upload_id"] = nil
      CustomWizard::Template.save(template_json, skip_jobs: true)
      wizard_record = CustomWizard::Template.find_record(template_json["id"])
      expect(UploadReference.exists?(target_type: "PluginStoreRow")).to eq(false)
    end

    it "are removed if a wizard field image is removed" do
      template_json["steps"][0]["fields"][0]["image"] = upload.url
      template_json["steps"][0]["fields"][0]["image_upload_id"] = upload.id
      CustomWizard::Template.save(template_json, skip_jobs: true)

      template_json["steps"][0]["fields"][0]["image"] = nil
      template_json["steps"][0]["fields"][0]["image_upload_id"] = nil
      CustomWizard::Template.save(template_json, skip_jobs: true)
      wizard_record = CustomWizard::Template.find_record(template_json["id"])
      expect(UploadReference.exists?(target_type: "PluginStoreRow")).to eq(false)
    end

    it "are removed if a wizard is removed" do
      template_json["steps"][0]["fields"][0]["image"] = upload.url
      template_json["steps"][0]["fields"][0]["image_upload_id"] = upload.id
      CustomWizard::Template.save(template_json, skip_jobs: true)
      CustomWizard::Template.remove(template_json["id"])
      expect(UploadReference.exists?(target_type: "PluginStoreRow")).to eq(false)
    end
  end

  context "wizard template list" do
    before do
      template_json_2 = template_json.dup
      template_json_2["id"] = "super_mega_fun_wizard_2"
      template_json_2["permitted"] = permitted_json["permitted"]
      CustomWizard::Template.save(template_json_2, skip_jobs: true)

      template_json_3 = template_json.dup
      template_json_3["id"] = "super_mega_fun_wizard_3"
      template_json_3["after_signup"] = true
      CustomWizard::Template.save(template_json_3, skip_jobs: true)
    end

    it "works" do
      expect(CustomWizard::Template.list.length).to eq(3)
    end

    it "can be filtered by wizard settings" do
      expect(CustomWizard::Template.list(setting: "after_signup").length).to eq(1)
    end

    it "can be ordered" do
      expect(
        CustomWizard::Template.list(order: "(value::json ->> 'permitted') IS NOT NULL DESC").first[
          "id"
        ],
      ).to eq("super_mega_fun_wizard_2")
    end
  end

  context "after time setting" do
    before do
      freeze_time Time.now
      @scheduled_time = (Time.now + 3.hours).iso8601

      @after_time_template = template_json.dup
      @after_time_template["after_time"] = true
      @after_time_template["after_time_scheduled"] = @scheduled_time
    end

    it "if enabled queues jobs after wizard is saved" do
      expect_enqueued_with(job: :set_after_time_wizard, at: Time.parse(@scheduled_time).utc) do
        CustomWizard::Template.save(@after_time_template)
      end
    end

    it "if disabled clears jobs after wizard is saved" do
      CustomWizard::Template.save(@after_time_template)
      @after_time_template["after_time"] = false

      expect_not_enqueued_with(job: :set_after_time_wizard) do
        CustomWizard::Template.save(@after_time_template)
      end
      expect(
        UserCustomField.exists?(name: "redirect_to_wizard", value: @after_time_template[:id]),
      ).to eq(false)
    end
  end
end
