class Base::AgentePublicoMunicipal < ApplicationRecord
	has_paper_trail

	include TradutorConcern

	belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria'
	belongs_to :usuario, class_name: 'Usuario'
	belongs_to :pessoa

	has_one :ordenador_de_despesa, dependent: :restrict_with_exception, class_name: 'Loa::OrdenadorDeDespesa', foreign_key: "agente_publico_id"

	has_many :configuracoes_sim, class_name: '::ConfiguracaoSim', foreign_key: 'agente_publico_id'
	has_many :documentos_do_processo, class_name: "Licitacao::DocumentoDoProcesso"
	has_many :gestores, dependent: :restrict_with_exception, class_name: 'Loa::Gestor', foreign_key: "agente_publico_id"
	has_many :requisicoes, class_name: "Administrativo::RequisicaoDeMaterial"

	delegate :cpf, :nome, :identidade, :orgao_expedidor, :endereco_completo, :telefone, :data_de_nascimento, :estado_civil, :dependentes, to: :pessoa, allow_nil: true

	validates_presence_of :pessoa_id, :unidade_orcamentaria_id, :ingresso_sistema_publico_municipal, :tipo_relacao_servico_publico, :data_da_posse, :tipo_de_cargo, :numero_de_posse

	validates_uniqueness_of :pessoa_id, scope: :unidade_orcamentaria_id, message: "Pessoa já cadastrada nesta unidade orçamentária."

	validates_length_of :numero_de_posse, maximum: 10
	validates_length_of :matricula_municipal, maximum: 10
	validates_length_of :carga_horaria_semanal, maximum: 2
	validates_length_of :codigo_pis_pasep, maximum: 11
	validates_length_of :titulo_de_eleitor, maximum: 15
	validates_length_of :nome_da_mae, maximum: 40
	validates_length_of :nome_do_pai, maximum: 40

	validates_numericality_of :carga_horaria_semanal, greater_than: 0, allow_nil: true

	validate :deve_ser_pessoa_fisica
	validate :verifica_se_tem_gestor_do_SIM_vinculado, on: :update

	include Enums

	def deve_ser_pessoa_fisica
		errors.add(:pessoa_id, "deve ser uma pessoa física") unless pessoa&.pessoa_fisica?
	end

	def verifica_se_tem_gestor_do_SIM_vinculado
		if self.configuracoes_sim.any? and self.configuracoes_sim.last.arquivo_id? and self.pessoa_id_changed?
			errors.add(:base, "Não é possivel editar essa pessoa, ela foi incluída como responsável no SIM.")
		end
	end

	def cpf_e_nome
		"#{cpf.try(:as_cpf)} - #{nome}"
	end

	def cpf_nome_unidade
		"#{cpf_e_nome} - #{unidade_orcamentaria.try(:sigla)}"
	end

	def nome_e_cpf
		"#{nome} - #{cpf.try(:as_cpf)}"
	end

	def unidade_orcamentaria_atual contexto_atual
		unidades_vinculadas_ids = unidade_orcamentaria.unidades_orcamentaria_vinculada
			.pluck(:unidade_orcamentaria_vinculada_id)

		unidades_pelo_codigo_ids = Loa::UnidadeOrcamentaria.joins(:orgao)
			.where(codigo: unidade_orcamentaria.codigo, loa_orgaos: { codigo: unidade_orcamentaria.orgao.codigo })
			.pluck(:id)

		unidades_ids = unidades_vinculadas_ids + unidades_pelo_codigo_ids

		contexto_atual.unidades_orcamentarias.where(id: unidades_ids).first
	end

	def to_sim(data_referencia)
		orcamento_exercicio = unidade_orcamentaria.orgao.orcamento.exercicio

		begin
			texto = ""
			texto << "951".to_s.sim_limite(3) + ","
			texto << Configuracao.first.codigo_do_municipio_no_tcm.to_s.sim_preenche(3) + ","
			texto << orcamento_exercicio.to_s.sim_limite(4, "00") + ","
			texto << unidade_orcamentaria.try(:orgao).try(:codigo).to_s.sim_preenche(2) + ","
			texto << unidade_orcamentaria.try(:codigo).to_s.codigo_uo_to_sim + ","
			texto << cpf.to_s.sim_limite(11) + ","
			texto << self.read_attribute_before_type_cast(:ingresso_sistema_publico_municipal).to_s + ","
			texto << self.read_attribute_before_type_cast(:tipo_relacao_servico_publico).to_s + ","
			texto << self.numero_de_posse.to_s.sim_limite(10) + ","
			texto << (data_da_posse.present? ? data_da_posse.sim_data : "") + ","
			texto << self.read_attribute_before_type_cast(:tipo_de_amparo_legal).to_s + ","
			texto << numero_de_posse.to_s.upcase.sim_limite(10) + ","
			texto << (data_do_amparo_legal.present? ? data_do_amparo_legal.sim_data : "''") + ","
			texto << (data_da_publicacao_do_amparo_legal.present? ? data_da_publicacao_do_amparo_legal.sim_data : "''") + ","
			texto << (data_da_posse.present? ? data_da_posse.sim_data : "''") + ","
			texto << matricula_municipal.to_s.upcase.sim_limite(15) + ","
			texto << self.read_attribute_before_type_cast(:situacao_funcional).to_s + ","
			texto << self.read_attribute_before_type_cast(:regime_juridico).to_s + ","
			texto << self.read_attribute_before_type_cast(:regime_previdenciario).to_s + ","
			texto << self.read_attribute_before_type_cast(:codigo_ocupacao).to_s + ","
			texto << self.read_attribute_before_type_cast(:tipo_de_cargo).to_s + ","
			texto << carga_horaria_semanal.to_f.to_s.upcase.sim_limite(2) + ","
			texto << self.read_attribute_before_type_cast(:tipo_de_programa).to_s + ","
			texto << codigo_pis_pasep.to_s.sim_limite(2) + ","
			texto << identidade.to_s.sim_limite(13) + ","
			texto << orgao_expedidor.to_s.sim_limite(13) + ","
			texto << titulo_de_eleitor.to_s.sim_limite(15) + ","
			texto << self.read_attribute_before_type_cast(:grau_de_instrucao).to_s + ","
			texto << codigo_sexo.to_s.sim_limite(1) + ","
			texto << nome.to_s.sim_limite(40) + ","
			texto << endereco_completo.to_s.sim_limite(255) + ","
			texto << telefone.to_s.sim_limite(11) + ","
			texto << (pessoa.data_de_nascimento.present? ? pessoa.data_de_nascimento.sim_data : "''") + ","
			texto << dependentes.to_f.to_s.sim_limite(2)  + ","
			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, self.numero_de_posse, atributo_falho, coluna)
			else
				raise e
			end
		end
	end
end
