module SimConcern
  extend ActiveSupport::Concern

	def lote_do_sim_gerado?(data=nil)
		return false if data.nil?
		orcamento_id = Orcamento.find_by(exercicio: data.year)
		lote_sim =
			Tcm::Lote.find_by(
				orcamento_id: orcamento_id,
				tipo: [Tcm::Lote.tipos[:todos], Tcm::Lote.tipos[:contabilidade]],
				mes_de_referencia: data.month,
				situacao: [Tcm::Lote.situacoes[:gerado], Tcm::Lote.situacoes[:finalizado]]
			)
		return lote_sim.present?
	end

	def balancete_pcasp_gerado?(data=nil)
		return false if data.nil?
		orcamento_id = Orcamento.find_by(exercicio: data.year)
		balancete =
			Contabilidade::BalanceteDeVerificacao.find_by(
				orcamento_id: orcamento_id,
				mes_de_referencia: data.month
			)
		return balancete.present?
	end

	def gera_linha_do_objeto(objeto, arquivo_sim, conteudo, tipo_de_poder)
		data = (arquivo_sim[2..7] + "01").to_date
		arquivo_referencia = "%#{arquivo_sim.gsub(arquivo_sim[2..7], "______")}%"
		linha_geradas = Tcm::Linha.find_by_sql("SELECT * FROM tcm_linhas WHERE modulo_id = #{objeto.id} AND modulo_type = '#{objeto.class.name}' AND arquivo_referencia like '#{arquivo_referencia}' ORDER BY created_at ASC")
		linha_gerada = linha_geradas.first rescue nil

		if linha_gerada.present? && lote_do_sim_gerado?(data) == false
			linha_gerada.update_columns(arquivo_referencia: arquivo_sim, conteudo: conteudo)

			linha_gerada.update_column(:tipo_de_poder, tipo_de_poder) if linha_gerada.tipo_de_poder.nil?
		elsif linha_gerada.present? == false && lote_do_sim_gerado?(data) == false
			linha_gerada = Tcm::Linha.create!(modulo_id: objeto.id, modulo_type: objeto.class.name, arquivo_referencia: arquivo_sim , conteudo: conteudo, tipo_de_poder: tipo_de_poder)
		end

		if linha_geradas && linha_geradas.count > 1
			ActiveRecord::Base.connection.execute("DELETE FROM tcm_linhas WHERE id <> #{linha_gerada.id} AND modulo_id = #{objeto.id} AND modulo_type = '#{objeto.class.name}' AND arquivo_referencia LIKE '#{arquivo_referencia}' AND arquivo_id IS NULL")
		end
	end

	def gera_linha_para_arquivo_do_sim
		case self.class.name

		when 'Contabilidade::Liquidacao'

		when 'Contabilidade::NotaFiscal'

		when 'Contabilidade::ItemDaNotaFiscal'

		when 'Contabilidade::Pagamento'

		when 'Patrimonio::MovimentacaoFinanceiraDoBem'
			data_referencia = self.data_da_movimentacao.to_date.beginning_of_month
			self.bem_patrimonial.atribui_tipo_de_poder unless self.bem_patrimonial.tipo_de_poder.present?
			tipo_de_poder = self.bem_patrimonial.tipo_de_poder

			if self.situacao_sim.present?
				self.gera_linha_do_objeto(self, "RP#{data_referencia.sim_data.first(6)}.PAT", self.to_sim_contas_redutoras_dos_bens(data_referencia),tipo_de_poder) rescue nil
			end

			if self.situacao.present?
				self.gera_linha_do_objeto(self, "RB#{data_referencia.sim_data.first(6)}.PAT", self.to_sim_ajuste_reavaliacao_patrimonial(data_referencia),tipo_de_poder) rescue nil
			end

		when 'Patrimonio::BemPatrimonial'
			data_referencia = self.data_do_tombamento.to_date.beginning_of_month
			self.atribui_tipo_de_poder unless self.tipo_de_poder.present?
			tipo_de_poder = self.tipo_de_poder

			self.gera_linha_do_objeto(self, "BP#{data_referencia.sim_data.first(6)}.PAT", self.to_sim(data_referencia),tipo_de_poder) rescue nil

			self.gera_linha_do_objeto(self, "BO#{data_referencia.sim_data.first(6)}.PAT", self.to_sim_bens_por_unidade(data_referencia),tipo_de_poder) rescue nil

			if self.recebimento_de_material&.ordem_de_compra&.empenho.present?
				self.gera_linha_do_objeto(self, "BN#{data_referencia.sim_data.first(6)}.PAT", self.to_sim_bens_por_empenho(data_referencia),tipo_de_poder) rescue nil
			end
		end
	end
end
