class Contabilidade::ConselhoDeRpps < ApplicationRecord
	has_paper_trail
	include IncrementadorDeCodigoConcern
	include TradutorConcern

	belongs_to :orcamento
	belongs_to :decreto, class_name: 'Contabilidade::Decreto'
	belongs_to :decreto_de_extincao, class_name: 'Contabilidade::Decreto'
	belongs_to :arquivo, class_name: 'Tcm::Arquivo', required: false
	has_many :membros_do_conselho_do_rpps, class_name: 'Contabilidade::MembroDoConselhoDoRpps', dependent: :destroy

	validates_presence_of :tipo_de_conselho, :decreto_id, :descricao_do_conselho

	validates_presence_of :decreto_de_extincao_id, if: Proc.new { data_de_extincao.present? }

	before_validation :atribui_codigo

	enum tipo_de_conselho: {
		conselho_fiscal: 0,
		conselho_adiministrativo: 1
	}

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

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

	def tipo_de_conselho_to_sim
		if conselho_fiscal?
			"F"
		else conselho_adiministrativo?
			"A"
		end
	end

	def extinto?
		decreto_de_extincao.present?
	end

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

	def to_sim
		# 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 << "968".sim_preenche(3) + "," #1
			texto << Configuracao.first.codigo_do_municipio_no_tcm.sim_preenche(3) + "," #2
			texto << (unidade_orcamentaria.present? ? unidade_orcamentaria.unidade_gestora.gestores.atual.cpf.sim_limite(11) : "''") + "," #3
			texto << decreto.data_da_legislacao.sim_data + "," #4
			texto << codigo_com_zeros.sim_limite(2) + "," #5
			texto << decreto.numero.to_s.sim_limite(10) + "," #6
			texto << decreto.data_da_publicacao.sim_data + "," #7
			texto << decreto.try(:funcao_do_instrumento_legal).to_s.upcase.sim_limite(1) + "," #8
			texto << tipo_de_conselho_to_sim.sim_limite(1) + "," #9
			texto << (data_de_extincao.present? ? data_de_extincao.sim_data : "0") + "," #10
			texto << (decreto_de_extincao.present? ? decreto_de_extincao.numero.to_s.sim_limite(15) : '""') + "," #11
			texto << (decreto_de_extincao.present? ? decreto_de_extincao.data_da_publicacao.to_s.sim_limite(15) : "0") + "," #12
	
			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, self.codigo, atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end
