# frozen_string_literal: true

describe "Admin Customize Form Templates", type: :system do
  let(:form_template_page) { PageObjects::Pages::FormTemplate.new }
  let(:ace_editor) { PageObjects::Components::AceEditor.new }

  fab!(:admin)
  fab!(:form_template)
  fab!(:category)

  before do
    SiteSetting.experimental_form_templates = true
    sign_in(admin)
  end

  describe "when visiting the page to customize form templates" do
    before { category.update!(form_template_ids: [form_template.id]) }

    it "should show the existing form templates in a table" do
      form_template_page.visit

      expect(form_template_page).to have_form_template_table
      expect(form_template_page).to have_form_template(form_template.name)
    end

    it "should show the categories the form template is used in" do
      form_template_page.visit

      expect(form_template_page).to have_form_template_table
      expect(form_template_page).to have_category_in_template_row(category.name)
    end

    it "should show the form template structure in a modal" do
      form_template_page.visit

      form_template_page.click_view_form_template
      expect(form_template_page).to have_template_structure("- type: input")
    end

    it "should show a preview of the template in a modal when toggling the preview" do
      form_template_page.visit

      form_template_page.click_view_form_template
      form_template_page.click_toggle_preview
      expect(form_template_page).to have_input_field("input")
    end

    context "when using the view template modal" do
      it "should navigate to the edit page when clicking the edit button" do
        form_template_page.visit
        form_template_page.click_view_form_template
        form_template_page.find(".d-modal__footer .btn-primary").click
        expect(page).to have_current_path("/admin/customize/form-templates/#{form_template.id}")
      end

      it "should delete the form template when clicking the delete button" do
        form_template_page.visit
        original_template_name = form_template.name
        form_template_page.click_view_form_template
        form_template_page.find(".d-modal__footer .btn-danger").click
        form_template_page.find(".dialog-footer .btn-primary").click

        expect(form_template_page).to have_no_form_template(original_template_name)
      end
    end
  end

  describe "when visiting the page to edit a form template" do
    it "should prefill form data" do
      visit("/admin/customize/form-templates/#{form_template.id}")
      expect(form_template_page).to have_name_value(form_template.name)
      # TODO(@keegan) difficult to test the ace editor content, todo later
    end
  end

  def quick_insertion_test(field_type, content)
    form_template_page.visit_new
    form_template_page.type_in_template_name("New Template")
    form_template_page.click_quick_insert(field_type)
    expect(ace_editor).to have_text(content)
  end

  describe "when visiting the page to create a new form template" do
    it "should allow admin to create a new form template" do
      form_template_page.visit_new

      sample_name = "My First Template"
      sample_template = "- type: input\n  id: name"

      form_template_page.type_in_template_name(sample_name)
      ace_editor.type_input(sample_template)
      form_template_page.click_save_button
      expect(form_template_page).to have_form_template(sample_name)
    end

    it "should disable the save button until form is filled out" do
      form_template_page.visit_new
      expect(form_template_page).to have_save_button_with_state(disabled: true)
      form_template_page.type_in_template_name("New Template")
      expect(form_template_page).to have_save_button_with_state(disabled: true)
      ace_editor.type_input("- type: input")
      expect(form_template_page).to have_save_button_with_state(disabled: false)
    end

    it "should disable the preview button until form is filled out" do
      form_template_page.visit_new
      expect(form_template_page).to have_preview_button_with_state(disabled: true)
      form_template_page.type_in_template_name("New Template")
      expect(form_template_page).to have_preview_button_with_state(disabled: true)
      ace_editor.type_input("- type: input")
      expect(form_template_page).to have_preview_button_with_state(disabled: false)
    end

    it "should show validation options in a modal when clicking the validations button" do
      form_template_page.visit_new
      form_template_page.click_validations_button
      expect(form_template_page).to have_validations_modal
    end

    it "should show a preview of the template in a modal when clicking the preview button" do
      form_template_page.visit_new
      form_template_page.type_in_template_name("New Template")
      ace_editor.type_input("- type: input\n  id: name")
      form_template_page.click_preview_button

      expect(form_template_page).to have_preview_modal
      expect(form_template_page).to have_input_field("input")
    end

    it "should render all the input field types in the preview" do
      form_template_page.visit_new
      form_template_page.type_in_template_name("New Template")
      ace_editor.type_input(
        "- type: input\n  id: name
\b\b- type: textarea\n  id: description
\b\b- type: checkbox\n  id: checkbox
\b\b- type: dropdown\n  id: dropdown
\b\b- type: upload\n  id: upload
\b\b- type: multi-select\n  id: multi-select",
      )
      form_template_page.click_preview_button
      expect(form_template_page).to have_input_field("input")
      expect(form_template_page).to have_input_field("textarea")
      expect(form_template_page).to have_input_field("checkbox")
      expect(form_template_page).to have_input_field("dropdown")
      expect(form_template_page).to have_input_field("upload")
      expect(form_template_page).to have_input_field("multi-select")
    end

    it "should allow quick insertion of checkbox field" do
      quick_insertion_test(
        "checkbox",
        '- type: checkbox
  id: enter-id-here
  attributes:
    label: "Enter label here"
  validations:
    # enter validations here',
      )
    end

    it "should allow quick insertion of short answer field" do
      quick_insertion_test(
        "input",
        '- type: input
  id: enter-id-here
  attributes:
    label: "Enter label here"
    placeholder: "Enter placeholder here"
  validations:
    # enter validations here',
      )
    end

    it "should allow quick insertion of long answer field" do
      quick_insertion_test(
        "textarea",
        '- type: textarea
  id: enter-id-here
  attributes:
    label: "Enter label here"
    placeholder: "Enter placeholder here"
  validations:
    # enter validations here',
      )
    end

    it "should allow quick insertion of dropdown field" do
      quick_insertion_test(
        "dropdown",
        '- type: dropdown
  id: enter-id-here
  choices:
    - "Option 1"
    - "Option 2"
    - "Option 3"
  attributes:
    none_label: "Select an item"
    label: "Enter label here"
  validations:
    # enter validations here',
      )
    end

    it "should allow quick insertion of upload field" do
      quick_insertion_test(
        "upload",
        '- type: upload
  id: enter-id-here
  attributes:
    file_types: ".jpg, .png, .gif"
    allow_multiple: false
    label: "Enter label here"
  validations:
    # enter validations here',
      )
    end

    it "should allow quick insertion of multiple choice field" do
      quick_insertion_test(
        "multiselect",
        '- type: multi-select
  id: enter-id-here
  choices:
    - "Option 1"
    - "Option 2"
    - "Option 3"
  attributes:
    none_label: "Select an item"
    label: "Enter label here"
  validations:
    # enter validations here',
      )
    end
  end
end