# frozen_string_literal: true

class DirectoryItemSerializer < ApplicationSerializer
  class UserSerializer < UserNameSerializer
    include UserPrimaryGroupMixin

    attributes :user_fields

    def user_fields
      fields = {}
      user_custom_field_map = @options[:user_custom_field_map] || {}
      searchable_fields = @options[:searchable_fields] || []

      object.user_custom_fields.each do |custom_field|
        user_field_id = user_custom_field_map[custom_field.name]
        next unless user_field_id

        current_value = fields.dig(user_field_id, :value)

        current_value = Array(current_value) if current_value

        new_value = current_value ? current_value << custom_field.value : custom_field.value

        is_searchable = searchable_fields.any? { |field| field.id == user_field_id }

        fields[user_field_id] = {
          value: new_value.is_a?(Array) ? new_value : [new_value],
          searchable: is_searchable,
        }
      end

      fields
    end

    def include_user_fields?
      @options[:user_custom_field_map].present?
    end
  end

  has_one :user, embed: :objects, serializer: UserSerializer

  attributes :id

  def id
    object.user_id
  end

  private

  def attributes
    hash = super

    @options[:attributes].each { |attr| hash.merge!("#{attr}": object[attr]) }

    if object.period_type == DirectoryItem.period_types[:all]
      hash.merge!(time_read: object.user_stat.time_read)
    end

    hash
  end
end