# frozen_string_literal: true

class ThemeSettingsMigration < ActiveRecord::Base
  belongs_to :theme
  belongs_to :theme_field

  validates :theme_id, presence: true
  validates :theme_field_id, presence: true

  validates :version, presence: true
  validates :name, presence: true
  validates :diff, presence: true

  def calculate_diff(settings_before, settings_after)
    diff = { additions: [], deletions: [] }

    before_keys = settings_before.keys
    after_keys = settings_after.keys

    removed_keys = before_keys - after_keys
    removed_keys.each { |key| diff[:deletions] << { key: key, val: settings_before[key] } }

    added_keys = after_keys - before_keys
    added_keys.each { |key| diff[:additions] << { key: key, val: settings_after[key] } }

    common_keys = before_keys & after_keys
    common_keys.each do |key|
      if settings_before[key] != settings_after[key]
        diff[:deletions] << { key: key, val: settings_before[key] }
        diff[:additions] << { key: key, val: settings_after[key] }
      end
    end

    self.diff = diff
  end
end

# == Schema Information
#
# Table name: theme_settings_migrations
#
#  id             :bigint           not null, primary key
#  theme_id       :integer          not null
#  theme_field_id :integer          not null
#  version        :integer          not null
#  name           :string(150)      not null
#  diff           :json             not null
#  created_at     :datetime         not null
#
# Indexes
#
#  index_theme_settings_migrations_on_theme_field_id        (theme_field_id) UNIQUE
#  index_theme_settings_migrations_on_theme_id_and_version  (theme_id,version) UNIQUE
#