class Licitacao::OrcamentoDaDespesaDoApostilamento < ApplicationRecord
	has_paper_trail

	attr_accessor :elemento_de_despesa_por_subacao_id, :subacao_id

	belongs_to :apostilamento, class_name: 'Licitacao::Apostilamento', required: true
	belongs_to :orcamento_da_despesa, class_name: "Loa::OrcamentoDaDespesa", required: true
	belongs_to :sub_elemento_de_despesa, class_name: "Contabilidade::SubElementoDeDespesa"

	has_many :itens_do_orcamento_da_despesa_do_apostilamento, class_name: 'Licitacao::ItemDoOrcamentoDaDespesaDoApostilamento', dependent: :destroy

	delegate :elemento_de_despesa_por_subacao, :unidade_orcamentaria, :fonte_de_recursos, to: :orcamento_da_despesa, allow_nil: true
	delegate :subacao, to: :elemento_de_despesa_por_subacao, allow_nil: true
	delegate :acao, to: :subacao, allow_nil: true
	delegate :elemento_de_despesa, to: :sub_elemento_de_despesa
	delegate :contrato, to: :apostilamento, allow_nil: true

	validates_presence_of :orcamento_da_despesa_id, :apostilamento_id, :sub_elemento_de_despesa_id
	validates_uniqueness_of :orcamento_da_despesa_id, scope: [:apostilamento_id, :sub_elemento_de_despesa_id]

	accepts_nested_attributes_for :itens_do_orcamento_da_despesa_do_apostilamento, reject_if: :all_blank, allow_destroy: true

	def classificacao
		"#{orcamento_da_despesa.try(:orgao).try(:codigo)} #{orcamento_da_despesa.try(:unidade_orcamentaria).try(:codigo_formatado)} #{orcamento_da_despesa.try(:subacao).try(:funcao).try(:codigo)} #{orcamento_da_despesa.try(:subacao).try(:subfuncao).try(:codigo)} #{orcamento_da_despesa.try(:subacao).try(:acao).try(:programa_de_governo).try(:codigo)} #{orcamento_da_despesa.try(:subacao).try(:acao).try(:codigo_completo)} #{orcamento_da_despesa.try(:subacao).try(:codigo) if orcamento_da_despesa.try(:fonte_de_recursos).try(:modulo).try(:trabalha_com_subacao?)}"
	end

	def classificacao_completa
		"#{classificacao} #{sub_elemento_de_despesa.codigo_formatado}"
	end

	def classificacao_completa_com_subelemento
		"#{orcamento_da_despesa.classificacao_parcial}
		#{subacao.try(:acao).try(:codigo_completo)}
		#{subacao.try(:codigo) if orcamento_da_despesa.try(:fonte_de_recursos).try(:modulo).try(:trabalha_com_subacao?)}
		#{sub_elemento_de_despesa.codigo_formatado}
		#{orcamento_da_despesa.try(:fonte_de_recursos).try(:codigo_completo)}"
	end

	def build_item
		itens_do_orcamento_da_despesa_do_apostilamento.build if itens_do_orcamento_da_despesa_do_apostilamento.empty?
	end

	def build_todos_itens_do_contrato
		itens_do_contrato_inseridos = itens_do_orcamento_da_despesa_do_apostilamento.map(&:item_do_contrato_id)
		contrato.itens_do_contrato.where.not(id: itens_do_contrato_inseridos).each do |item_do_contrato|
			itens_do_orcamento_da_despesa_do_apostilamento.build(
				item_do_contrato_id: item_do_contrato.id,
				quantidade: item_do_contrato.quantidade_atual,
				saldo: item_do_contrato.quantidade_atual * item_do_contrato.valor_unitario
			)
		end
	end
end