require "rails_helper"

describe "Admin settings", :admin do
  scenario "Index" do
    visit admin_settings_path

    expect(page).to have_content "Level 1 public official"
    expect(page).to have_content "Maximum ratio of anonymous votes per Debate"
    expect(page).to have_content "Comments body max length"
  end

  scenario "Update" do
    visit admin_settings_path

    within "tr", text: "Level 1 public official" do
      fill_in "Level 1 public official", with: "Super Users of level 1"
      click_button "Update"
    end

    expect(page).to have_content "Value updated"
  end

  describe "Map settings initialization" do
    scenario "Map is only initialized when the map settings tab content is shown" do
      Setting["feature.map"] = true

      visit admin_settings_path

      expect(page).not_to have_css ".map-location.leaflet-container", visible: :all

      click_link "Map configuration"

      expect(page).to have_css ".map-location.leaflet-container"
    end
  end

  describe "Update map" do
    scenario "Should not be able when map feature deactivated" do
      Setting["feature.map"] = false

      visit admin_settings_path
      click_link "Map configuration"

      expect(page).to have_content "To show the map to users you must enable " \
                                   '"Proposals and budget investments geolocation" ' \
                                   'on "Features" tab.'
      expect(page).not_to have_css ".map-location"
    end

    scenario "Should update marker" do
      Setting["feature.map"] = true

      visit admin_settings_path
      click_link "Map configuration"

      expect(page).to have_css ".map-location"
      expect(page).not_to have_content "To show the map to users you must enable " \
                                       '"Proposals and budget investments geolocation" ' \
                                       'on "Features" tab.'

      expect(page).to have_field "Latitude", with: "51.48"
      expect(page).to have_field "Longitude", with: "0.0"
      expect(page).to have_css ".map-icon[aria-label='Latitude: 51.48. Longitude: 0.0']"

      within "#map-form" do
        find(".map-location").click
        click_button "Update"
      end

      expect(page).to have_content "Map configuration updated successfully"
      expect(page).to have_field "Latitude"
      expect(page).to have_css ".map-icon"
      expect(page).not_to have_field "Latitude", with: "51.48"
      expect(page).not_to have_css ".map-icon[aria-label='Latitude: 51.48. Longitude: 0.0']"
    end
  end

  describe "Update content types" do
    scenario "stores the correct mime types" do
      Setting["uploads.images.content_types"] = "image/png"
      setting = Setting.find_by!(key: "uploads.images.content_types")

      visit admin_settings_path
      click_link "Images and documents"

      within "#edit_setting_#{setting.id}" do
        expect(find_field("PNG")).to be_checked
        expect(find_field("JPG")).not_to be_checked
        expect(find_field("GIF")).not_to be_checked

        check "GIF"

        click_button "Update"
      end

      expect(page).to have_content "Value updated"

      click_link "Images and documents"

      within "#edit_setting_#{setting.id}" do
        expect(find_field("PNG")).to be_checked
        expect(find_field("GIF")).to be_checked
        expect(find_field("JPG")).not_to be_checked
      end
    end
  end

  describe "Update Remote Census Configuration" do
    before do
      Setting["feature.remote_census"] = true
    end

    scenario "Should not be able when remote census feature deactivated" do
      Setting["feature.remote_census"] = nil
      visit admin_settings_path
      find("#remote-census-tab").click

      expect(page).to have_content "To configure remote census (SOAP) you must enable " \
                                   '"Configure connection to remote census (SOAP)" ' \
                                   'on "Features" tab.'
    end

    scenario "Should be able when remote census feature activated" do
      visit admin_settings_path
      find("#remote-census-tab").click

      expect(page).to have_content("General Information")
      expect(page).to have_content("Request Data")
      expect(page).to have_content("Response Data")
      expect(page).not_to have_content "To configure remote census (SOAP) you must enable " \
                                       '"Configure connection to remote census (SOAP)" ' \
                                       'on "Features" tab.'
    end
  end

  describe "Should redirect to same tab after update setting" do
    context "remote census" do
      before do
        Setting["feature.remote_census"] = true
      end

      scenario "On #tab-remote-census-configuration" do
        visit admin_settings_path
        find("#remote-census-tab").click

        within "tr", text: "Endpoint" do
          fill_in "Endpoint", with: "example.org/webservice"
          click_button "Update"
        end

        expect(page).to have_current_path(admin_settings_path)
        expect(page).to have_css("div#tab-remote-census-configuration.is-active")
      end
    end

    scenario "On #tab-configuration" do
      visit admin_settings_path

      within "tr", text: "Level 1 public official" do
        fill_in "Level 1 public official", with: "Super Users of level 1"
        click_button "Update"
      end

      expect(page).to have_current_path(admin_settings_path)
      expect(page).to have_css("div#tab-configuration.is-active")
    end

    context "map configuration" do
      before do
        Setting["feature.map"] = true
      end

      scenario "On #tab-map-configuration" do
        visit admin_settings_path
        click_link "Map configuration"

        within "tr", text: "Latitude" do
          fill_in "Latitude", with: "-3.636"
          click_button "Update"
        end

        expect(page).to have_current_path(admin_settings_path)
        expect(page).to have_css("div#tab-map-configuration.is-active")
      end

      scenario "On #tab-map-configuration when using the interactive map" do
        visit admin_settings_path(anchor: "tab-map-configuration")
        within "#map-form" do
          click_button "Update"
        end

        expect(page).to have_content("Map configuration updated successfully.")
        expect(page).to have_current_path(admin_settings_path)
        expect(page).to have_css("div#tab-map-configuration.is-active")
      end
    end

    scenario "On #tab-proposals" do
      visit admin_settings_path
      find("#proposals-tab").click

      within "tr", text: "Polls description" do
        fill_in "Polls description", with: "Polls description"
        click_button "Update"
      end

      expect(page).to have_current_path(admin_settings_path)
      expect(page).to have_css("div#tab-proposals.is-active")
    end

    scenario "On #tab-participation-processes" do
      visit admin_settings_path
      find("#participation-processes-tab").click
      within("tr", text: "Debates") { click_button "Yes" }

      expect(page).to have_current_path(admin_settings_path)
      expect(page).to have_css("div#tab-participation-processes.is-active")
    end

    scenario "On #tab-feature-flags" do
      visit admin_settings_path
      find("#features-tab").click
      within("tr", text: "Featured proposals") { click_button "No" }

      expect(page).to have_current_path(admin_settings_path)
      expect(page).to have_css("div#tab-feature-flags.is-active")
    end

    scenario "On #tab-sdg-configuration" do
      Setting["feature.sdg"] = true
      visit admin_settings_path
      click_link "SDG configuration"

      within("tr", text: "Related SDG in debates") do
        click_button "Yes"

        expect(page).to have_button "No"
      end

      expect(page).to have_current_path(admin_settings_path)
      expect(page).to have_css("h2", exact_text: "SDG configuration")
    end

    scenario "On #tab-images-and-documents" do
      Setting["feature.sdg"] = true
      visit admin_settings_path(anchor: "tab-images-and-documents")
      within("tr", text: "Maximum number of documents") do
        fill_in "Maximum number of documents", with: 5
        click_button "Update"
      end

      expect(page).to have_current_path(admin_settings_path)
      expect(page).to have_field("Maximum number of documents", with: 5)
    end
  end

  describe "Skip verification" do
    scenario "deactivate skip verification" do
      Setting["feature.user.skip_verification"] = "true"

      visit admin_settings_path
      find("#features-tab").click

      within("tr", text: "Skip user verification") do
        click_button "Yes"

        expect(page).to have_button "No"
      end
    end

    scenario "activate skip verification" do
      Setting["feature.user.skip_verification"] = nil

      visit admin_settings_path
      find("#features-tab").click

      within("tr", text: "Skip user verification") do
        click_button "No"

        expect(page).to have_button "Yes"
      end
    end
  end

  describe "SDG configuration tab" do
    scenario "is enabled when the sdg feature is enabled" do
      Setting["feature.sdg"] = true

      visit admin_settings_path
      click_link "SDG configuration"

      expect(page).to have_css "h2", exact_text: "SDG configuration"
    end

    scenario "is disabled when the sdg feature is disabled" do
      Setting["feature.sdg"] = false

      visit admin_settings_path
      click_link "SDG configuration"

      expect(page).to have_content "To show the configuration options from " \
                                   "Sustainable Development Goals you must " \
                                   'enable "SDG" on "Features" tab.'
    end

    scenario "is enabled right after enabling the feature" do
      Setting["feature.sdg"] = false

      visit admin_settings_path

      click_link "Features"

      within("tr", text: "SDG") do
        click_button "No"

        expect(page).to have_button "Yes"
      end

      click_link "SDG configuration"

      expect(page).to have_css "h2", exact_text: "SDG configuration"
    end
  end

  describe "Machine learning settings" do
    scenario "show the machine learning feature but not its settings" do
      Setting["feature.machine_learning"] = true

      visit admin_settings_path

      expect(page).not_to have_content "Machine Learning"
      expect(page).not_to have_content "Comments Summary"
      expect(page).not_to have_content "Related Content"
      expect(page).not_to have_content "Tags"
      expect(page).not_to have_css ".translation_missing"

      click_link "Features"

      expect(page).to have_content "Machine Learning"
      expect(page).not_to have_content "Comments Summary"
      expect(page).not_to have_content "Related Content"
      expect(page).not_to have_content "Tags"
      expect(page).not_to have_css ".translation_missing"
    end
  end
end
