module Base
class PessoasController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!,  except: [:resultado_por_empenho, :pesquisa_por_empenho, :resultado_credores, :pesquisa_credores, :editar_contas, :atualiza_contas, :valida_se_cnpj_ja_existe, :pesquisa, :resultado]
	before_action :set_pessoa, only: [:show, :edit, :update, :ativa_inativa_fornecedor, :destroy]
	before_action :disponibiliza_dependencias, only: [:new, :edit]
	before_action :disponibiliza_dependencias_form_categorias, only: [:editar_categorias]

	# GET /base/pessoas
	def index
		@q = Pessoa.order(:id).ransack(query_params)
		@pessoas = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		@tipos_de_pessoa = Base::TipoDePessoa.all

		respond_to do |format|
			format.html
			format.json
		end
	end

	def pesquisa
		@q = Pessoa.search(params[:q])
		@tipos_de_pessoa = Base::TipoDePessoa.all
		render layout: false
	end

	def resultado
		@q = Pessoa.order(:id).search(params[:q])
		@pessoas = @q.result(distinct: false).paginate(page: params[:page], per_page: 7)
		render layout: false
	end

	def pesquisa_credores
		@q = Pessoa.where(fornecedor: true).search(params[:q])
		@tipos_de_pessoa = Base::TipoDePessoa.all
		render layout: false
	end

	def resultado_credores
		@q = Pessoa.where("fornecedor = true").order(:id).search(params[:q])
		@pessoas = @q.result(distinct: false).paginate(page: params[:page], per_page: 7)
		render layout: false
	end

	def pesquisa_por_empenho
		@q = Pessoa.search(params[:q])
		@tipos_de_pessoa = Base::TipoDePessoa.all
		render layout: false
	end

	def resultado_por_empenho
		filtra_pessoa_por_empenho
		render layout: false
	end

	# GET /base/pessoas/valida_se_cnpj_ja_existe
	def valida_se_cnpj_ja_existe
		cnpj = params[:cnpj].tr('./-', '')
		resultado = Base::Pessoa.where(cnpj: cnpj).present?
		render json: {
			'cnpj_existe': resultado
		}
	end

	# GET /base/pessoas/1
	def show
		respond_to do |format|
			format.html
			format.json
		end
	end

	# GET /base/pessoas/new
	def new
		@pessoa = Pessoa.new
	end

	# GET /base/pessoas/1/edit
	def edit
	end

	# POST /base/pessoas
	def create

		@pessoa = Pessoa.new( pessoa_params )
		if @pessoa.pessoa_juridica?
			@pessoa.cpf = nil
		else
			@pessoa.cnpj = nil
		end

		if @pessoa.save
			redirect_to @pessoa, notice: 'Pessoa foi criada com sucesso.'
		else
			disponibiliza_dependencias
			render :new
		end
	end

	# PATCH/PUT /base/pessoas/1
	def update
		if @pessoa.pessoa_juridica?
			@pessoa.cpf = nil
		else
			@pessoa.cnpj = nil
		end

		if @pessoa.update( pessoa_params )
			redirect_to @pessoa, notice: 'Pessoa foi atualizada com sucesso.'
		else
			erros_das_contas = []
			@pessoa.pessoas_contas_bancarias.each{ |conta| erros_das_contas << "Erro(s) na conta nº #{conta.try(:numero_da_conta)}:#{conta.errors.messages.flatten.join(',')}" if conta.errors.count > 0}	
			alerta = erros_das_contas.present? ? erros_das_contas : @pessoa.errors.full_messages
			disponibiliza_dependencias
			redirect_to edit_base_pessoa_path, alert: alerta.flatten.join(',')
		end
	end

	# DELETE /base/pessoas/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@pessoa)
		redirect_to base_pessoas_url, mensagem
	end

	# GET /base/pessoas/1/editar_cnaes
	def editar_cnaes
		@pessoa = Pessoa.find( params[:pessoa_id] )
		@cnaes = Base::Cnae.all
		if @pessoa.cnaes.empty?
			@pessoa.cnaes.build
		end
	end

	# PATCH /base/pessoas/1/atualiza_cnaes
	def atualiza_cnaes
		return if bloqueia_usuario_com_base_em 'editar_cnaes'
		@pessoa = Pessoa.find( params[:pessoa_id] )
		if @pessoa.update( pessoa_params )
			redirect_to base_pessoa_path(@pessoa), notice: 'CNAEs atualizados com sucesso.'
		else
			@cnaes = Base::Cnae.all
			render :editar_cnaes
		end
	end

	# GET /base/pessoas/1/editar_contas
	def editar_contas
		return if bloqueia_usuario_com_base_em 'update'
		@pessoa = Pessoa.find( params[:pessoa_id] )
		@bancos = Base::Banco.order(:numero_do_banco).all

		if @pessoa.pessoas_contas_bancarias.empty?
			@pessoa.pessoas_contas_bancarias.build
		end
	end

	# PATCH /base/pessoas/1/atualiza_contas
	def atualiza_contas
		@pessoa = Pessoa.find( params[:pessoa_id] )

		begin
			if @pessoa.update( pessoa_params )
				redirect_to base_pessoa_path(@pessoa), notice: 'Contas Bancárias atualizadas com sucesso.'
			else
				@bancos = Base::Banco.all
				if @pessoa.errors.messages.keys.any?
					flash[:alert] = "O cadastro do fornecedor apresenta erros nos seguintes campos: #{@pessoa.errors.messages.keys.join(' ')}"
				end
				render :editar_contas
			end
		rescue Exception => e
			if e.message.include?("Cannot delete record because of dependent")
				flash[:alert] = "Registro não pode ser deletado, pois já possui vínculo com empenhos e/ou pagamentos."
			else
				flash[:alert] = "Erro ao atualizar as contas bancárias do fornecedor: #{e.message}"
			end
			redirect_to request.referrer
		end
	end

	#GET /base/pessoas/1/retorna_dados_do_responsavel
	def retorna_dados_do_responsavel
		#@responsavel = Licitacao::PessoaDoProjeto.find_by(id: params[:pessoa_do_projeto_id])
		@responsavel = Base::Responsavel.find(params[:pessoa_id])
		render json: {
			'nome': @responsavel.nome,
			'cpf': @responsavel.cpf,
			'rg': @responsavel.rg
		}
	end

	def editar_categorias
		@pessoa = Pessoa.find( params[:pessoa_id] )
		@pessoa.categorias_da_pessoa.build() if @pessoa.categorias_da_pessoa.empty?
	end

	def atualizar_categorias
		@pessoa = Pessoa.find( params[:pessoa_id] )
		if @pessoa.update(pessoa_params)
			redirect_to @pessoa, notice: 'Categorias atualizada com sucesso'
		else
			disponibiliza_dependencias_form_categorias
			render :editar_categorias
		end
	end

	def ativa_inativa_fornecedor
		return if bloqueia_usuario_com_base_em 'update'
		begin
			if @pessoa.ativo != nil
				@pessoa.send(:define_ativo_inativo)
				redirect_to @pessoa, notice: 'Pessoa foi alterada com sucesso.'
			end
		rescue => exception
			raise ActiveRecord::Rollback
		end
	end

	private
	def set_pessoa
		@pessoa = Pessoa.find( params[:id] )
	end

	def disponibiliza_dependencias_form_categorias
		@categorias = Base::Categoria.principais.order(:codigo)
	end

	def disponibiliza_dependencias
		@estados = Base::Estado.all
		@estados_civis = Base::EstadoCivil.all
		@tipos_de_pessoas = Base::TipoDePessoa.all
		@portes = Base::Pessoa.portes
	end

	# Permite apenas os parâmetros específicos
	def pessoa_params
		params.require(:base_pessoa).permit( :fundo_de_investimento, :fornecedor, :nome, :tipo_de_pessoa_id, :cpf,
			:cnpj, :identidade, :inscricao_estadual, :data_da_emissao, :orgao_expedidor,
			:uf_orgao_expedidor_id, :inscricao_municipal, :cep, :logradouro, :numero,
			:complemento, :bairro, :cidade_id, :telefone, :data_de_nascimento, :nit,
			:profissao, :estado_civil_id, :naturalidade, :data_do_cadastro, :porte, :nome_fantasia,
			:observacoes, :email, :email_alternativo, :folha_de_pagamento, :diversos_contribuintes, :dependentes,
			:tipo_de_entidade, :entidade_publica, :ativo,
			cnaes_attributes: [:principal, :id, :cnae_id, :pessoa_id, :_destroy],
			pessoas_contas_bancarias_attributes:[:id, :pessoa_id, :conta_bancaria_id, :banco_id, :agencia, :numero_da_conta, :operacao, :chave_pix, :_destroy, :digito_agencia],
			categorias_da_pessoa_attributes:[:id, :pessoa_id, :categoria_id, :sub_categoria_id, :_destroy]
		)
	end

	def filtra_pessoa_por_empenho
		@pessoas = Pessoa.where('base_pessoas.ativo = ?', true).order(:id).search(params[:q])
		clausulas = if params[:contrato_id]
			{
			id: Licitacao::Contrato.find(
				params[:contrato_id]
			).pessoa_do_projeto.pessoa_id
			}
		elsif params[:projeto_id]
			@projeto = Licitacao::Projeto.find_by_id(params[:projeto_id])
			{
				id: @projeto.ganhadores_dos_lotes.pluck(:pessoa_id)
			}
		end
		@pessoas = @pessoas.result.where(clausulas).paginate(page: params[:page], per_page: 7)
	end
end
end
