class Licitacao::MembroDaComissao < ApplicationRecord
	has_paper_trail
	include TradutorConcern

	belongs_to :comissao, class_name: 'Licitacao::Comissao'
	belongs_to :agente_publico_municipal, class_name: "Base::AgentePublicoMunicipal"

	has_many :projetos, through: :comissao

	validates_presence_of :comissao_id, :agente_publico_municipal_id, :tipo, :data_de_admissao

	validates_uniqueness_of :agente_publico_municipal_id, scope: [:comissao_id]
	validate :commisao_so_pode_ter_um_presidente
	validate :data_de_admissao_deve_ser_posterior_data_de_criacao_da_comissao

	before_destroy :verifica_se_membro_esta_extinto

	validates :data_de_admissao, sabado_ou_domingo_ou_feriado: { flexivel: false }
	validates :data_de_saida, sabado_ou_domingo_ou_feriado: { flexivel: false }

	enum tipo: {
		presidente: 1,
		membro_comum: 2,
		suplente_exercendo_a_funcao_de_membro: 3,
		agente_de_contratacao: 4,
		pregoeiro: 5,
		membro_da_equipe_de_apoio: 6
	}

	def self.tipos_i18n(comissao = nil)
		chave = (comissao.present? && comissao.de_parceria?) ? 'parceria' : 'padrao'
		tipos = chave == 'parceria' ? self.tipos.except(:agente_de_contratacao, :pregoeiro, :membro_da_equipe_de_apoio) : self.tipos
		tipos.map{|tipo| [I18n.t("activerecord.attributes.licitacao/membro_da_comissao/tipo.#{tipo[0]}.#{chave}"), tipo[0]]}
	end

	def self.tipo_i18n
		chave = self.comissao.de_parceria? ? 'parceria' : 'padrao'
		I18n.t("activerecord.attributes.licitacao/membro_da_comissao/tipo.#{self.tipo}.#{chave}")
	end

	def verifica_se_membro_esta_extinto
			if data_de_saida.present?
					raise Exception.new('Não é possivel deletar membros extintos')
			end
	end

	def commisao_so_pode_ter_um_presidente
		errors.add(:tipo, "Já possuí presidente cadastrado") if self.comissao && self.comissao.possui_presidente? && self.presidente? && self.tipo_was != "presidente"
	end

	def data_de_admissao_deve_ser_posterior_data_de_criacao_da_comissao
		if data_de_admissao.present? && comissao.present? && comissao.data_da_portaria.present?
			errors.add(:data_de_admissao, "Deve ser posterior a \"#{comissao.data_da_portaria}\"") unless comissao.data_da_portaria <= data_de_admissao
		end
	end

	def sim_tipo
		codigo = case self.tipo
			when "presidente" then "1"
			when "membro_comum" then "2"
			when "suplente_exercendo_a_funcao_de_membro" then "3"
			when "agente_de_contratacao" then "4"
			when "pregoeiro" then "5"
			when "membro_da_equipe_de_apoio" then "6"
		end
	end

	def sim_tipo_parceria
		codigo = case self.tipo
			when "presidente" then "P"
			when "membro_comum" then "M"
			when "suplente_exercendo_a_funcao_de_membro" then "S"
		end
	end

	#TCM
	def to_sim
		begin
			valida_gestor_da_unidade
			texto = ""
			texto << "504".to_s.sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
			texto << comissao.unidade_gestora.gestores.atual.cpf.sim_preenche(11) + ","
			texto << comissao.data_de_criacao.to_date.sim_data + ","
			texto << comissao.numero.sim_preenche(2) + ","
			texto << agente_publico_municipal.cpf.sim_preenche(11) + ","
			texto << agente_publico_municipal.nome.sim_limite(40) + ","
			texto << agente_publico_municipal.endereco_completo.gsub(/["\r\n]/, "").sim_limite(255) + ","
			texto << (!agente_publico_municipal.telefone.blank? ? agente_publico_municipal.telefone.gsub(/[^0-9]/, '').sim_limite(11) : "".sim_preenche(11)) + ","
			texto << sim_tipo.sim_preenche(1) + ","
			texto << self.data_de_admissao.sim_data + ","
			texto << (self.data_de_saida.nil? ? "0" : self.data_de_saida.sim_data) + ","
			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

	def to_sim_parceria
		begin
			valida_gestor_da_unidade
			texto = ""
			texto << "534".to_s.sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
			texto << comissao.unidade_gestora.gestores.atual.cpf.sim_preenche(11) + ","
			texto << comissao.data_de_criacao.to_date.sim_data + ","
			texto << comissao.numero.sim_preenche(2) + ","
			texto << agente_publico_municipal.cpf.sim_preenche(11) + ","
			texto << agente_publico_municipal.nome.sim_limite(40) + ","
			texto << agente_publico_municipal.endereco_completo.gsub(/["\r\n]/, "").sim_limite(255) + ","
			texto << (!agente_publico_municipal.telefone.blank? ? agente_publico_municipal.telefone.gsub(/[^0-9]/, '').sim_limite(11) : "".sim_preenche(11)) + ","
			texto << sim_tipo_parceria.sim_preenche(1) + ","
			texto << self.data_de_admissao.sim_data + ","
			texto << (self.data_de_saida.nil? ? "0" : self.data_de_saida.sim_data) + ","
			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

	def valida_gestor_da_unidade
		unless comissao.unidade_gestora.gestores.atual.present?
			# exercicio = comissao.unidade_gestora.orcamento.exercicio.to_s
			raise "Não existe gestor ativo para a Unidade Gestora: " << "#{comissao.unidade_gestora.nome}."
		end
	end

end
