class Licitacao::Comissao < ApplicationRecord
	has_paper_trail
	include IncrementadorDeCodigoConcern
	include TradutorConcern

	attr_accessor :estado_id

	belongs_to :unidade_gestora, class_name: 'Loa::UnidadeGestora'
	belongs_to :cidade, class_name: 'Base::Cidade'
	belongs_to :orcamento, class_name: '::Orcamento'

	has_many :membros_da_comissao, dependent: :destroy
	has_many :projetos, class_name: 'Licitacao::Projeto'
	validates_presence_of :unidade_gestora_id, :tipo_de_comissao, :numero_da_portaria , :nome, :data_de_criacao
	validates_inclusion_of :de_parceria, in: [true, false], message: "não pode ficar em branco"

	before_validation :atribui_numero

	validates_length_of :numero_da_portaria_de_extincao, maximum: 15
	validates_length_of :numero_da_portaria, maximum: 15
	validates_length_of :nome, minimum: 3

	validates :data_da_extincao, sabado_ou_domingo_ou_feriado: { flexivel: false }

	after_initialize :define_estado

	enum tipo_de_comissao: {
		permanente: 0,
		especial: 1,
		comissao_de_selecao: 2,
		comissao_de_monitoramento_e_avaliacao: 3,
		equipe_de_apoio: 4,
		agente_de_contratacao: 5
	}

	def define_estado
		self.estado_id = cidade.try(:estado_id)
	end

	def nome_da_unidade_e_do_presidente
		membro = self.membros_da_comissao.find_by(tipo: "1").agente_publico_municipal.nome
		return "#{unidade_gestora.nome} - #{membro}"
	end

	def nome_tipo_e_unidade
		"#{nome} #{localizar(:tipo_de_comissao)} do(a) #{unidade_gestora.try(:nome)}"
	end

	def nome_tipo_numero_da_portaria_e_unidade
		"#{nome} #{localizar(:tipo_de_comissao)} - #{numero_da_portaria} - #{unidade_gestora.try(:nome)}"
	end

	def numero_da_portaria_e_nome_da_unidade
		"#{numero_da_portaria} - #{unidade_gestora.nome}"
	end

	def atribui_numero
		gerar_sugestao_codigo(:numero, 2, {unidade_gestora_id: unidade_gestora.id}).to_i if numero.nil? && unidade_gestora.present?
	end

	def extinta?
		data_da_extincao.present? && numero_da_portaria_de_extincao.present?
	end

	def possui_presidente?
		membros_da_comissao.presidente.count > 0
	end

	def nome_do_presidente
		self.membros_da_comissao.presidente.first.try(:agente_publico_municipal).try(:nome) || self.membros_da_comissao.agente_de_contratacao.first.try(:agente_publico_municipal).try(:nome) || ""
	end

	def sim_tipo_portaria
		codigo = case self.tipo_de_comissao
			when "permanente" then "1"
			when "especial" then "2"
			when "agente_de_contratacao" then "3"
			when "equipe_de_apoio" then "4"
			when "comissao_de_selecao" then "S"
			when "comissao_de_monitoramento_e_avaliacao" then "M"
		end
	end

	#TCM
	def to_sim(data_referencia)
		begin
			valida_gestor_da_unidade
			texto = ""
			texto << "503".to_s.sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
			texto << unidade_gestora.gestor_no_periodo(data_referencia).cpf.sim_preenche(11) + ","
			texto << self.data_de_criacao.to_date.sim_data + ","
			texto << (self.numero.nil? ? "" : self.numero).sim_preenche(2) + ","
			texto << self.numero_da_portaria.sim_limite(15) + ","
			texto << sim_tipo_portaria.sim_preenche(1) + ","
			texto << (self.data_da_extincao.nil? ? "0" : self.data_da_extincao.sim_data) + ","
			texto << (self.numero_da_portaria_de_extincao.nil? ? "".sim_limite(1) : self.numero_da_portaria_de_extincao.sim_limite(15)) + ","
			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.numero, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

	def to_sim_parceria
		begin
			valida_gestor_da_unidade
			texto = ""
			texto << "533".to_s.sim_preenche(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
			texto << unidade_gestora.gestores.atual.cpf.sim_preenche(11) + ","
			texto << self.data_de_criacao.to_date.sim_data + ","
			texto << self.numero.sim_preenche(2) + ","
			texto << self.numero_da_portaria.sim_limite(15) + ","
			texto << sim_tipo_portaria.sim_preenche(1) + ","
			texto << (self.data_da_extincao.nil? ? "0" : self.data_da_extincao.sim_data) + ","
			texto << (self.numero_da_portaria_de_extincao.nil? ? "".sim_limite(1) : self.numero_da_portaria_de_extincao.sim_limite(15)) + ","
			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.numero, atributo_falho, coluna)
			else
				raise e
			end
		end
	end

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

	def possui_endereco?
		rua.present?
	end

	def endereco_formatado
		endereco_formatado = String.new
		endereco_formatado << "#{rua} " if rua.present?
		endereco_formatado << "#{numero_da_rua}, " if numero_da_rua.present?
		endereco_formatado << "Bairro: #{bairro} " if bairro.present?

		return endereco_formatado
	end

end
