module Obra
class TransferenciasController < ApplicationController
	include ControllerConcern
	include ObraControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, only: %i[index new create show edit update destroy]
	before_action :set_transferencia, only: [:show, :edit, :update, :destroy, :prestar_conta, :nao_prestou_conta]
	before_action :disponibiliza_dependencias, only: [:create, :new, :update, :edit]

	# GET /obra/transferencias
	def index
		@q =
			if logado_na_contabilidade? # Pode ver todos os convênios
				Obra::Transferencia.order(data: :desc).search(params[:q])
			else
				Obra::Transferencia.where(modulo_contabil: false).order(data: :desc).search(params[:q])
			end

		@transferencias = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores.all
	end

	# GET /obra/transferencias/1
	def show; end

	# GET /obra/transferencias/new
	def new
		@transferencia = Obra::Transferencia.new
	end

	# POST /obra/transferencias
	def create
		@transferencia = Obra::Transferencia.new(transferencia_params)

		if @transferencia.save
			redirect_to @transferencia, notice: 'Transferência/Convênio foi criado(a) com sucesso.'
		else
			render :new
		end
	end

	# GET /obra/transferencias/1/edit
	def edit; end

	# PATCH/PUT /obra/transferencias/1
	def update
		if @transferencia.update(transferencia_params)
			redirect_to @transferencia, notice: 'Transferência/Convênio foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	# DELETE /obra/transferencias/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@transferencia)
		redirect_to obra_transferencias_url, mensagem
	end

	# PATCH/PUT /obra/transferencia/prestar_conta
	def prestar_conta
		return if bloqueia_usuario_com_base_em 'update'
		if @transferencia.prestar_conta
			redirect_to @transferencia, notice: 'O convênio foi finalizado e prestado contas.'
		end
	end

	# PATCH/PUT /obra/transferencias/1/nao_prestou_conta
	def nao_prestou_conta
		return if bloqueia_usuario_com_base_em 'update'
		if @transferencia.save(validate: false)
			redirect_to @transferencia, notice: 'O convênio retornou para o status anterior.'
		end
	end

	# GET /obra/transferencias/:unidade_orcamentaria_id/retorna_obras_por_unidade_orcamentaria
	def retorna_obras_por_unidade_orcamentaria
		unidade_orcamentaria = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id])
		unidades_orcamentarias_ids = unidade_orcamentaria.unidades_orcamentarias_de_exercicios_anteriores_ids
		@obras = Contabilidade::Obra.obra.includes(contratos_da_obra: {contrato: :unidade_orcamentaria_do_exercicio}).where(loa_unidades_orcamentarias: {id: unidades_orcamentarias_ids})
		respond_to do |format|
			format.json { render json: @obras, methods: :descricao_da_obra }
		end
	end

	# GET /obra/transferencias/:unidade_orcamentaria_id/retorna_contas_bancarias_por_unidade_orcamentaria
	def retorna_contas_bancarias_por_unidade_orcamentaria
		@contas_bancarias = Loa::UnidadeOrcamentaria.find(params[:unidade_orcamentaria_id]).contas_bancarias.left_outer_joins(agencia: :banco).order(conta_caixa_pcasp: :desc, sigla: :asc, numero_da_conta: :asc).all
		respond_to do |format|
			format.json { render json: @contas_bancarias, methods: :descricao_para_detalhe_do_pagamento }
		end
	end

	# GET /obra/transferencias/:tipo/retorna_modalidades
	def retorna_modalidades
		modalidades = modalidades_permitidas(params[:tipo])
		render json: modalidades.map{|modalidade| {key: modalidade[0], nome: Obra::Transferencia.localizar('modalidade', modalidade[0])}}
	end

	private

	def modalidades_permitidas tipo
		modalidades_transferencias = ["automatica", "sus", "fnde", "fnas", "outros"]
		if tipo == "transferencia"
			modalidades = Obra::Transferencia.modalidades.select {|m| modalidades_transferencias.include?(m)}
		elsif tipo == "convenio"
			modalidades = Obra::Transferencia.modalidades.select {|m| !modalidades_transferencias.include?(m)}
		end
	end

	def set_transferencia
		@transferencia = Obra::Transferencia.find( params[:id] )
	end

	def disponibiliza_dependencias
		if @transferencia.present? && @transferencia.persisted?
			@orgaos = @transferencia.unidade_orcamentaria.orgao.orcamento.orgaos_do_usuario(current_usuario).joins(:tipo_de_unidade_administrativa).where.not(base_tipos_de_unidades_administrativas: {codigo: '99'}).order( :codigo )
		else
			@orgaos = contexto_atual.orgaos_do_usuario(current_usuario).joins(:tipo_de_unidade_administrativa).where.not(base_tipos_de_unidades_administrativas: {codigo: '99'}).order( :codigo )
		end
		@fornecedores = Base::Pessoa.includes(:tipo_de_pessoa).fornecedores.all
		@funcoes = contexto_atual.funcoes.all

		@modalidades = []
		@unidades_orcamentarias = []
		@obras = []
		@receitas = []
		@contas_bancarias = []
		@unidades_orcamentarias_arrecadadoras = contexto_atual.unidades_orcamentarias

		if @transferencia.present? && @transferencia.persisted?
			@obras = Contabilidade::Obra.joins(:contratos).where(licitacao_contratos: {unidade_orcamentaria_do_exercicio_id: @transferencia.unidade_orcamentaria_id}).all
			@receitas = contexto_atual.naturezas_da_receita.joins(:unidades_orcamentarias_por_natureza_da_receita).where("loa_unidades_orcamentarias_por_natureza_da_receita.unidade_orcamentaria_id =?", @transferencia.unidade_orcamentaria_id).order('base_naturezas_da_receita.codigo')
			@unidades_orcamentarias = @transferencia.unidade_orcamentaria.orgao.unidades_orcamentarias
			if @transferencia.pre_convenio.present? && @transferencia.pre_convenio.fontes_de_recursos.joins(:contas_bancarias).any?
				@contas_bancarias = @transferencia.pre_convenio.fontes_de_recursos.joins(:contas_bancarias)
			else
				@contas_bancarias = @transferencia.unidade_orcamentaria.contas_bancarias
			end
			@modalidades = modalidades_permitidas(@transferencia.tipo)
		end
	end

	# Permite apenas os parâmetros específicos
	def transferencia_params
		params.require(:obra_transferencia).permit(
			:data, :tipo, :modalidade, :unidade_orcamentaria_id, :obra_id, :orgao_cedente_id,
			:funcao_id, :natureza_da_receita_id, :objeto, :natureza_da_receita_aplicacao_fin_id,
			:inicio_da_vigencia, :fim_da_vigencia, :prazo_para_prestacao_de_contas, :valor_repasse,
			:valor_contrapartida, :valor_total, :codigo_original_transferencia, :conta_bancaria_id,
			:esfera, :modulo_contabil, :informacao_complementar, :unidade_orcamentaria_arrecadadora_id
		)
	end
end
end
