# frozen_string_literal: true

RSpec.describe DirectoryItemSerializer do
  fab!(:user)
  fab!(:directory_column) do
    DirectoryColumn.create!(name: "topics_entered", enabled: true, position: 1)
  end
  fab!(:user_field_1) { Fabricate(:user_field, name: "user_field_1", searchable: true) }
  fab!(:user_field_2) { Fabricate(:user_field, name: "user_field_2", searchable: false) }

  before { DirectoryItem.refresh! }

  context "when serializing user fields" do
    it "serializes user fields with searchable and non-searchable values" do
      user.user_custom_fields.create!(name: "user_field_1", value: "Value 1")
      user.user_custom_fields.create!(name: "user_field_2", value: "Value 2")

      user_fields =
        serialized_payload(
          attributes: DirectoryColumn.active_column_names,
          user_custom_field_map: {
            "user_field_1" => user_field_1.id,
            "user_field_2" => user_field_2.id,
          },
          searchable_fields: [user_field_1],
        )

      expect(user_fields).to eq(
        user_field_1.id => {
          value: ["Value 1"],
          searchable: true,
        },
        user_field_2.id => {
          value: ["Value 2"],
          searchable: false,
        },
      )
    end

    it "handles multiple values for the same field" do
      user.user_custom_fields.create!(name: "user_field_1", value: "Value 1")
      user.user_custom_fields.create!(name: "user_field_1", value: "Another Value")

      user_fields =
        serialized_payload(
          attributes: DirectoryColumn.active_column_names,
          user_custom_field_map: {
            "user_field_1" => user_field_1.id,
          },
          searchable_fields: [],
        )

      expect(user_fields[user_field_1.id]).to eq(
        value: ["Value 1", "Another Value"],
        searchable: false,
      )
    end
  end

  context "when serializing directory columns" do
    let :serializer do
      directory_item =
        DirectoryItem.find_by(user: user, period_type: DirectoryItem.period_types[:all])
      DirectoryItemSerializer.new(
        directory_item,
        { attributes: DirectoryColumn.active_column_names },
      )
    end

    it "serializes attributes for enabled directory_columns" do
      DirectoryColumn.update_all(enabled: true)

      payload = serializer.as_json
      expect(payload[:directory_item].keys).to include(*DirectoryColumn.pluck(:name).map(&:to_sym))
    end

    it "doesn't serialize attributes for disabled directory columns" do
      DirectoryColumn.update_all(enabled: false)
      directory_column = DirectoryColumn.first
      directory_column.update(enabled: true)

      payload = serializer.as_json
      expect(payload[:directory_item].keys.count).to eq(4)
      expect(payload[:directory_item]).to have_key(directory_column.name.to_sym)
      expect(payload[:directory_item]).to have_key(:id)
      expect(payload[:directory_item]).to have_key(:user)
      expect(payload[:directory_item]).to have_key(:time_read)
    end
  end

  private

  def serialized_payload(serializer_opts)
    serializer =
      DirectoryItemSerializer.new(
        DirectoryItem.find_by(user: user),
        serializer_opts.merge(scope: Guardian.new(user)),
      )
    serializer.as_json.dig(:directory_item, :user, :user_fields)
  end
end
