class DialogTab < ApplicationRecord
  include DialogMixin
  has_many   :dialog_groups, -> { order(:position) }, :dependent => :destroy
  belongs_to :dialog
  validate :validate_children

  alias_attribute :order, :position

  def each_dialog_field(&block)
    dialog_fields.each(&block)
  end

  def dialog_fields
    dialog_groups.flat_map(&:dialog_fields)
  end

  def dialog_resources
    dialog_groups
  end

  def validate_children
    # To remove the meaningless error message like "Dialog groups is invalid" when child's validation fails
    errors.delete(:dialog_groups)
    errors.add(:base, _("Tab %{tab_label} must have at least one Box") % {:tab_label => label}) if dialog_groups.blank?

    dialog_groups.each do |dg|
      next if dg.valid?
      dg.errors.full_messages.each do |err_msg|
        errors.add(:base, _("Tab %{tab_label} / %{error_message}") % {:tab_label => label, :error_message => err_msg})
      end
    end
  end

  def update_dialog_groups(groups)
    updated_groups = []
    groups.each do |group|
      if group.key?('id')
        DialogGroup.find(group['id']).tap do |dialog_group|
          dialog_group.update(group.except('id', 'href', 'dialog_tab_id', 'dialog_fields'))
          dialog_group.update_dialog_fields(group['dialog_fields'])
          updated_groups << dialog_group
        end
      else
        updated_groups << DialogImportService.new.build_dialog_groups('dialog_groups' => [group]).first
      end
    end
    self.dialog_groups = updated_groups
  end

  def deep_copy
    dup.tap do |new_tab|
      new_tab.dialog_groups = dialog_groups.collect(&:deep_copy)
    end
  end
end
