class Pca::OrcamentoDaDespesaPorAcao < ApplicationRecord
	has_paper_trail

	attr_accessor :elemento_de_despesa_por_subacao_id, :unidade_orcamentaria_id

	delegate :unidade_orcamentaria, to: :subacao, allow_nil: true

	belongs_to :acao, class_name: "Pca::Acao"
	belongs_to :subacao, class_name: "Loa::Subacao"
	#Retirado momentaneamente a pedido do consultor Lukas, pois segundo ele, o PCA não é pra ter ligação nenhuma com o sistema e é só um informativo que com base nos *relatorios* dele será usado para criação do orçamento
	belongs_to :orcamento_da_despesa, class_name: "Loa::OrcamentoDaDespesa"
	belongs_to :sub_elemento_de_despesa, class_name: "Contabilidade::SubElementoDeDespesa"

	validates_presence_of :acao_id, :sub_elemento_de_despesa_id, :valor

	after_create :salvar_orcamento_da_despesa

	after_commit :atribui_sequencial_para_pncp, if: Proc.new{self.sequencial_pca.nil?}
	
	def elemento_de_despesa_por_subacao_da_dotacao
		if (self.subacao.nil? || self.sub_elemento_de_despesa.nil?) 
			nil
		else
			Loa::ElementoDeDespesaPorSubacao.where(subacao: self.subacao, elemento_de_despesa:self.sub_elemento_de_despesa.elemento_de_despesa).last
		end
	end

	def salvar_orcamento_da_despesa
		if self.elemento_de_despesa_por_subacao_da_dotacao == nil
			errors.add(:base, 'A dotação precisa ter valores')
		else
			orcamento_da_despesa = Loa::OrcamentoDaDespesa.where(elemento_de_despesa_por_subacao: self.elemento_de_despesa_por_subacao_da_dotacao).last
			self.update_column(:orcamento_da_despesa_id, orcamento_da_despesa.id)
		end
	end

	def atribui_sequencial_para_pncp
		orcs_da_depesa_da_ug = Pca::OrcamentoDaDespesaPorAcao.joins(acao: [unidade_orcamentaria: :unidade_gestora]).where('loa_unidades_gestoras.id = ? AND EXTRACT(YEAR FROM pca_acoes.data_de_previsao_da_contratacao) = ?', self.acao.unidade_orcamentaria.unidade_gestora_id, self.acao.data_de_previsao_da_contratacao.year).order('data_de_previsao_da_contratacao ASC')

		orcs_da_depesa_da_ug_sem_sequencial = orcs_da_depesa_da_ug.where('pca_orcamentos_da_despesa_por_acao.sequencial_pca IS NULL').order(:data_de_previsao_da_contratacao)

		sequencial = orcs_da_depesa_da_ug.where('pca_orcamentos_da_despesa_por_acao.sequencial_pca IS NOT NULL').order(:sequencial_pca).last.sequencial_pca.to_i + 1 rescue 1

		orcs_da_depesa_da_ug_sem_sequencial.each do |item|
			item.sequencial_pca = sequencial
			item.save(validate: false)
			sequencial += 1
		end
	end

	def to_pca
		hash = {
			numeroItem: sequencial_pca, #fazer task para ajustar sequencial
			categoriaItemPca: self.categoria_item,
			catalogo: 2,
			classificacaoCatalogo: "#{self.classificacao_catalogo}",
			classificacaoSuperiorCodigo: "#{self.sub_elemento_de_despesa.codigo}",
			classificacaoSuperiorNome: "#{self.sub_elemento_de_despesa.descricao}",
			codigoItem: self.sub_elemento_de_despesa.codigo_completo,
			unidadeFornecimento: 'UN',
			quantidade: 1,
			valorUnitario: self.valor,
			valorTotal: self.valor,
			valorOrcamentoExercicio: self.acao.orcamento.valor_das_acoes_pca,
			dataDesejada: self.acao.data_de_previsao_da_contratacao,
		}
	end

	def categoria_item
		case self&.acao&.tipos_de_despesa_por_acao&.first&.tipo_de_despesa
		when	'material_de_consumo'
			1
		when	'material_permanente'
			1
		when	'servico_continuo'
			2
		when	'servico_nao_continuo'
			2
		when	'solucoes_de_ti'
			5
		when	'obras'
			3
		when	'servico_de_engenharia'
			4
		when	'locacoes_de_imoveis'
			6
		when	'premiacoes'
			2
		when	'outros'
			2
		else
			2
		end
	end
	
	def classificacao_catalogo
		case self&.acao&.tipos_de_despesa_por_acao&.first&.tipo_de_despesa
		when	'material_de_consumo'
			1
		when	'material_permanente'
			1
		when	'servico_continuo'
			2
		when	'servico_nao_continuo'
			2
		when	'solucoes_de_ti'
			2
		when	'obras'
			2
		when	'servico_de_engenharia'
			2
		when	'locacoes_de_imoveis'
			2
		when	'premiacoes'
			2
		when	'outros'
			2
		else
			2
		end
	end
end
