# Para gerar os pagamentos a partir dessa classe é necessário que você veja todas as instancias, menos a que tiver conjunto_padrao: true
# Ela é usada apenas como base para gerar as outras instancias

class Contabilidade::ConjuntoDeContasDoGrupoDeRetencao < ApplicationRecord
  has_paper_trail

  belongs_to :grupo_de_retencao_do_controle_de_pagamento, required: true
  belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria', required: true
  belongs_to :conta_origem, class_name: 'Base::ContaBancaria'
  belongs_to :conta_destino, class_name: 'Base::ContaBancaria'
  belongs_to :fonte_de_recursos, class_name: 'Base::FonteDeRecursos'
  belongs_to :liquidacao

  delegate :valor_das_retencoes, to: :liquidacao, allow_nil: true

  validates :liquidacao_id, presence: true, unless: proc { conjunto_padrao? }
  validates :valor, numericality: { greater_than: 0 }, unless: proc { conjunto_padrao? }

  validate :valor_nao_deve_ultrapassar_valor_retido_na_liquidacao, if: proc { cadastrado_no_form? && liquidacao_id.present? }

  before_save :cria_conjuntos_secundarios, if: proc { conjunto_padrao? && mudou_alguma_conta? }
  after_save :deleta_conjuntos_que_nao_vieram_do_form, if: proc { cadastrado_no_form? }

  private
  def valor_nao_deve_ultrapassar_valor_retido_na_liquidacao
    errors.add(:valor, "Não pode ser maior que o valor retido na liquidação #{valor_das_retencoes.real_contabil}") if valor > valor_das_retencoes
  end

  def mudou_alguma_conta?
    conta_origem_id_changed? || conta_destino_id_changed?
  end

  def cria_conjuntos_secundarios
    grupo_de_retencao_do_controle_de_pagamento.conjuntos_de_contas_do_grupo_de_retencao.where.not(id: id).where(cadastrado_no_form: false).delete_all
    liquidacoes_ids = grupo_de_retencao_do_controle_de_pagamento.conjuntos_de_contas_do_grupo_de_retencao.pluck(:liquidacao_id).compact

    grupo_de_retencao_do_controle_de_pagamento.liquidacoes.where.not(id: liquidacoes_ids).each do |liquidacao|
      Contabilidade::ConjuntoDeContasDoGrupoDeRetencao.create!({
        grupo_de_retencao_do_controle_de_pagamento_id: grupo_de_retencao_do_controle_de_pagamento_id,
        unidade_orcamentaria_id: unidade_orcamentaria_id,
        conta_origem_id: conta_origem_id, 
        conta_destino_id: conta_destino_id, 
        fonte_de_recursos: fonte_de_recursos_id,
        liquidacao_id: liquidacao.id,
        valor: liquidacao.valor_das_retencoes
      })
    end
  end

  def deleta_conjuntos_que_nao_vieram_do_form
    grupo_de_retencao_do_controle_de_pagamento.conjuntos_de_contas_do_grupo_de_retencao.where.not(id: id).where(cadastrado_no_form: [nil, false], liquidacao_id: liquidacao_id).delete_all
  end
end
