module Base
	class Subfuncao < ApplicationRecord
		has_paper_trail

		belongs_to :funcao

		has_many :subacoes, class_name: 'Loa::Subacao', dependent: :restrict_with_exception
		has_many :orcamentos_da_despesa, through: :subacoes

		validates_presence_of :codigo, :nome, :funcao_id
		validates_uniqueness_of :nome, scope: :funcao_id
		validates_uniqueness_of :codigo, scope: :funcao_id

		def valor_total_fixado_da_despesa
			self.subacoes.sum(:fixacao_da_despesa).to_f
		end

		def valor_total_fixado_da_despesa_por_unidade(unidade = nil)
			total = 0
			if unidade.nil?
				total += self.subacoes.sum(:fixacao_da_despesa).to_f
			elsif unidade.class.name == 'Loa::UnidadeOrcamentaria'
				total += self.subacoes.where(unidade_orcamentaria_id: unidade.id).sum(:fixacao_da_despesa).to_f
			else
				unidade.each do |unidade|
					total += self.subacoes.where(unidade_orcamentaria_id: unidade.id).sum(:fixacao_da_despesa).to_f
				end
			end
			total
		end

		def valor_total_realizado_da_despesa
			total = self.subacoes.inject(0) { |total, subacao|
				total + subacao.valor_total_realizado_da_despesa.to_f
			}
		end

		def valor_total_fixado_da_despesa_orcamentos_fiscal
			self.subacoes.orcamentos_fiscal.sum(:fixacao_da_despesa).to_f
		end

		def valor_total_fixado_da_despesa_seguridade_social
			self.subacoes.seguridade_social.sum(:fixacao_da_despesa).to_f
		end

		def codigo_e_nome
			"#{codigo} - #{nome}"
		end

		def codigo_para_ic
			"#{self.funcao.codigo}#{self.codigo}"
		end
	end
end
