class Tableless::SubElementoDeDespesa < Tableless::ElementoDeDespesa
	include ActiveModel::Model

	attr_accessor :sub_elemento_de_despesa_id

	validates :sub_elemento_de_despesa_id, presence: true

	def gerar_sub_elemento_de_despesa(modulo, base_sub_elemento_de_despesa_para_atualizar = nil)
		ActiveRecord::Base.transaction do
			base_categoria_economica = Base::CategoriaEconomica.find_by(modulo_id: modulo.id, modulo_type: modulo.class.name, codigo: "#{categoria_economica.codigo}0000000")
			base_grupo_de_natureza_da_despesa = Base::GrupoDeNaturezaDaDespesa.find_by(categoria_economica_id: base_categoria_economica.id, codigo: "#{categoria_economica.codigo}#{grupo_de_natureza_da_despesa.codigo}000000")
			base_modalidade_de_aplicacao = criar_modalidade_de_aplicacao(base_grupo_de_natureza_da_despesa)
			base_elemento_de_despesa = criar_elemento_de_despesa(base_modalidade_de_aplicacao)

			criar_sub_elemento_de_despesa(base_elemento_de_despesa.id)
		end
	end

	def sub_elemento_de_despesa
		NaturezaDaDespesa::SubElementoDeDespesa.find(sub_elemento_de_despesa_id)
	end

	def codigo_detalhado
		codigo = "#{categoria_economica.codigo}#{grupo_de_natureza_da_despesa.codigo}#{modalidade_de_aplicacao.codigo}#{elemento_de_despesa.codigo}#{sub_elemento_de_despesa.codigo}"
		return codigo.gsub(/(\d{1})(\d{1})(\d{2})(\d{2})(\d{2})/, '\1.\2.\3.\4.\5')
	end

	private
		def criar_sub_elemento_de_despesa(base_elemento_de_despesa_id)
			dados_sub_elemento_de_despesa = {
				elemento_de_despesa_id: base_elemento_de_despesa_id,
				codigo: sub_elemento_de_despesa.codigo,
				descricao: sub_elemento_de_despesa.descricao,
				elemento_de_gasto_id: sub_elemento_de_despesa.id
			}

			contabilidade_sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where(dados_sub_elemento_de_despesa.except(:descricao, :elemento_de_gasto_id))

			unless contabilidade_sub_elemento_de_despesa.present?
				Contabilidade::SubElementoDeDespesa.create!(dados_sub_elemento_de_despesa)
			else
				adicionar_erro_de_duplicidade_de_sub_elemento
			end
		end

		def adicionar_erro_de_duplicidade_de_sub_elemento
			self.errors.add(:sub_elemento_de_despesa_id, "#{codigo_detalhado} já está cadastrado")
			return false
		end

		def criar_elemento_de_despesa(base_modalidade_de_aplicacao)
			dados_elemento_de_despesa = {
				modalidade_de_aplicacao_id: base_modalidade_de_aplicacao.id,
				codigo: "#{categoria_economica.codigo}#{grupo_de_natureza_da_despesa.codigo}#{modalidade_de_aplicacao.codigo}#{elemento_de_despesa.codigo}00",
				descricao: elemento_de_despesa.descricao
			}

			base_elemento_de_despesa = Base::ElementoDeDespesa.ativos.find_by(dados_elemento_de_despesa.except(:descricao))
			if base_elemento_de_despesa.blank?
				folha_de_pagamento = tem_folha_de_pagamento ? 1 : nil
				base_elemento_de_despesa = Base::ElementoDeDespesa.create!(dados_elemento_de_despesa.merge(folha_de_pagamento: folha_de_pagamento))
			end

			return base_elemento_de_despesa
		end
end
