class Loa::CotaOrcamentaria < ApplicationRecord
  has_paper_trail

  belongs_to :orcamento, class_name: "Orcamento"
  belongs_to :unidade_orcamentaria, class_name: "Loa::UnidadeOrcamentaria"
  belongs_to :unidade_orcamentaria_exercicio_anterior, class_name: "Loa::UnidadeOrcamentaria", foreign_key: "unidade_orcamentaria_exercicio_anterior_id"
  has_many :fontes_das_cotas_orcamentarias, class_name: "Loa::FonteDaCotaOrcamentaria", dependent: :destroy
  has_many :doccs, class_name: "Loa::Docc", through: :fontes_das_cotas_orcamentarias
  has_many :propostas_orcamentarias_setoriais, class_name: "Loa::PropostaOrcamentariaSetorial", through: :fontes_das_cotas_orcamentarias

  validates :fontes_das_cotas_orcamentarias, uniq_nested_attributes: { atributo: :fonte_de_recursos_id, mensagem: "Fonte de recursos deve ser única por unidade." }
  accepts_nested_attributes_for :fontes_das_cotas_orcamentarias, reject_if: :all_blank, allow_destroy: true
  validates_associated :fontes_das_cotas_orcamentarias

  validates_presence_of :unidade_orcamentaria_id


  def calcular_percentual_empenhado
    self.fontes_das_cotas_orcamentarias.each do |fonte|
      total_empenhado_no_ano_anterior = Loa::FonteDaCotaOrcamentaria
        .joins(:cota_orcamentaria).includes(:cota_orcamentaria)
        .where(loa_cotas_orcamentarias: {orcamento_id: contexto_atual.id})
        .where(fonte_de_recursos_id: fonte.fonte_de_recursos_id)
        .sum(:empenhado_ano_anterior)

      percentual = total_empenhado_no_ano_anterior > 0 ? (fonte.empenhado_ano_anterior.to_d / total_empenhado_no_ano_anterior.to_d) * 100 : 0
      fonte.update_column(:percentual_empenho_ano_anterior, percentual.round(2))

      fonte.update_column(:valor_proposto, fonte.calcular_valor_proposto.to_d)
    end
  end

  def calcular_percentual_proposto
    self.fontes_das_cotas_orcamentarias.each do |fonte|
      total_proposto = Loa::FonteDaCotaOrcamentaria
        .joins(:cota_orcamentaria).includes(:cota_orcamentaria)
        .where(loa_cotas_orcamentarias: {orcamento_id: contexto_atual.id})
        .where(fonte_de_recursos_id: fonte.fonte_de_recursos_id)
        .sum(:valor_proposto)
        
      percentual = total_proposto > 0 ? (fonte.valor_proposto.to_d / total_proposto.to_d) * 100 : 0
      fonte.update_column(:percentual_proposto, percentual.round(2).to_d)
    end
  end

  def possui_valor_distribuido_no_orcamento?
    self.doccs.map(&:valor).sum.to_d > 0 || self.propostas_orcamentarias_setoriais.map(&:valor).sum.to_d > 0
  end
  
end
