# frozen_string_literal: true

# Gem.find_files('ledger_sync/core/ledgers/test_ledger/serializer_type/**/*.rb').each { |path| require path }

module LedgerSync
  module Ledgers
    module TestLedger
      class Serializer < LedgerSync::Serializer
        def serialize(args = {})
          deep_merge_unmapped_values = args.fetch(:deep_merge_unmapped_values, {})
          only_changes               = args.fetch(:only_changes, false)
          resource                   = args.fetch(:resource)

          ret = super(
            only_changes: only_changes,
            resource: resource
          )
          return ret unless deep_merge_unmapped_values.any?

          deep_merge_if_not_mapped(
            current_hash: ret,
            hash_to_search: deep_merge_unmapped_values
          )
        end

        def self.amount(hash_attribute, args = {})
          attribute(
            hash_attribute,
            {
              type: Serialization::Type::IntegerToAmountFloatType.new
            }.merge(args)
          )
        end

        def self.date(hash_attribute, args = {})
          attribute(
            hash_attribute,
            {
              type: LedgerSync::Serialization::Type::FormatDateType.new(format: '%Y-%m-%d')
            }.merge(args)
          )
        end

        def self.id
          attribute('Id', resource_attribute: :ledger_id)
        end

        private

        def deep_merge_if_not_mapped(current_hash:, hash_to_search:)
          hash_to_search.each do |key, value|
            current_hash[key] = if current_hash.key?(key)
                                  if value.is_a?(Hash) && current_hash[key].present?
                                    deep_merge_if_not_mapped(
                                      current_hash: current_hash[key],
                                      hash_to_search: value
                                    )
                                  else
                                    current_hash[key]
                                  end
                                else
                                  value
                                end
          end

          current_hash
        end
      end
    end
  end
end
