class Contabilidade::ComiteDeInvestimento < ApplicationRecord
	include IncrementadorDeCodigoConcern
	has_paper_trail
	belongs_to :decreto, class_name: 'Contabilidade::Decreto', foreign_key: :decreto_id
	belongs_to :decreto_de_extincao, class_name: 'Contabilidade::Decreto', foreign_key: :decreto_de_extincao_id
	belongs_to :orcamento, class_name: 'Orcamento', required: true
	belongs_to :arquivo, class_name: 'Tcm::Arquivo', required: false
	has_many :membros_dos_comites_de_investimento, class_name: 'Contabilidade::MembroDoComiteDeInvestimento', dependent: :destroy

	validates_presence_of :decreto_id, :data_da_criacao

	validate :valida_data_do_commite_ativo, if: :existe_comite_ativo_na_data?

	before_validation :atribui_codigo

	def enviado_ao_sim?
		arquivo_id.present? && arquivo_id > 0 && arquivo.lote.lote_processado_ou_enviado?
	end

	def atribui_codigo
		gerar_sugestao_codigo( :codigo, 2, { orcamento_id: orcamento_id }, true ) if orcamento.present? && codigo.blank?
	end

	def extinta?
		data_de_extincao.present?
	end

	def codigo_com_zeros
		self.codigo.to_i.try(:digitos, 2)
	end

	def valida_data_do_commite_ativo
		errors.add(:data_da_criacao, "Já existe um Comitê com esse periodo") unless self.data_da_criacao.nil?
	end

	def existe_comite_ativo_na_data?
		if self.data_da_criacao_changed?
			orcamento.comites_de_investimento.where(data_de_extincao: nil).where(' ? BETWEEN "contabilidade_comites_de_investimento"."data_da_criacao" AND ?', data_da_criacao, Date.today).any?
		end
	end

	def to_sim(data_referencia)
		# Variáveis necessárias para gerar o SIM
		begin
			unidade_orcamentaria = orcamento.unidades_orcamentarias.joins(:tipo_de_unidade_administrativa).find_by('base_tipos_de_unidades_administrativas.codigo = ?', "07")
			texto = ""
			texto << "965".sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + ","
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.unidade_gestora.gestores.atual.cpf.sim_limite(11) : "''") + ","
			texto << data_da_criacao.sim_data + ","
			texto << codigo_com_zeros.sim_limite(2) + ","
			texto << decreto.numero.to_s.sim_limite(10) + ","
			texto << decreto.data_da_legislacao.sim_data + ","
			texto << decreto.read_attribute_before_type_cast(:funcao_do_instrumento_legal).to_s + ","
			texto << (data_de_extincao.present? ? data_de_extincao.sim_data : "0") + ","
			texto << (decreto_de_extincao.present? ? decreto_de_extincao.numero.to_s.sim_limite(15) : "''") + ","
			texto << (decreto_de_extincao.present? ? decreto_de_extincao.data_da_publicacao.sim_data : "0") + ","
			texto << data_referencia.to_s + ","
	
			return texto
		rescue => e
			if e.class.to_s == "NoMethodError"
				atributo_falho = e.message.split(" ")[2]
				coluna = CSV.parse(texto, :headers => false).last.count
				raise e.mensagem_traduzida(self, "", atributo_falho, coluna)
			else
				raise e
			end
		end
	end

end
