class Controladoria::LiquidacoesController < ApplicationController
	include ControladoriaControllersConcern
	include ControllerConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: :enviar_para_administrativo
	before_action :set_liquidacao, except: :index
	before_action :disponibiliza_dependencias, only: :index
	before_action -> {verifica_mes_bloqueado(@liquidacao)}, only: [:retornar_para_administrativo]

	def index
		@status = []
		@q =
			if params[:pendentes]
				@url_liquidacoes = pendentes_controladoria_liquidacoes_path
				Contabilidade::Liquidacao.joins(empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]]]).where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) }).where(status: :enviado_para_controladoria).order(data_de_solicitacao: :desc).search(params[:q])
			else
				@url_liquidacoes = controladoria_liquidacoes_path
				Contabilidade::Liquidacao
					.select('*,CASE WHEN NOT contabilidade_liquidacoes.data_da_liquidacao is NULL THEN contabilidade_liquidacoes.data_da_liquidacao ELSE  contabilidade_liquidacoes.data_de_solicitacao END AS data_order_liq')
						.joins(empenho: [orcamento_da_despesa: [elemento_de_despesa_por_subacao: [subacao: :unidade_orcamentaria]]])
							.where(loa_unidades_orcamentarias: {id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id) })
								.where.not(status: :enviado_para_controladoria).order('data_order_liq DESC').search(params[:q])
			end
			if !params[:pendentes]
				@status = Contabilidade::Liquidacao.status.reject {|status| status == "enviado_para_controladoria" }
			end

		if params["liquidacao_sem_itens_do_empenho"].eql?("true")
			@liquidacao_sem_itens_do_empenho = true

			@liquidacoes = @q.result(distinct: true)
			.joins("INNER JOIN contabilidade_empenhos ON contabilidade_liquidacoes.empenho_id = contabilidade_empenhos.id INNER JOIN contabilidade_itens_da_nota_fiscal ON contabilidade_itens_da_nota_fiscal.liquidacao_id = contabilidade_liquidacoes.id LEFT OUTER JOIN contabilidade_itens_do_empenho ON contabilidade_itens_do_empenho.empenho_id = contabilidade_empenhos.id")
				.where("( contabilidade_itens_do_empenho.id is NULL OR (NOT contabilidade_itens_da_nota_fiscal.item_id IN (SELECT contabilidade_itens_do_empenho.item_id from contabilidade_itens_do_empenho) ) )")
					.paginate(page: params[:page], per_page: 10)
		else
			@liquidacao_sem_itens_do_empenho = false
			@liquidacoes = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		end

		@unidades_gestoras = contexto_atual.unidades_gestoras
		@pessoas = Base::Pessoa.order(:nome)
		@tipos_de_nota_fiscal = Contabilidade::Liquidacao.nota_fiscal_tipos.sort_by{ |tipo| tipo }
	end

	# GET /controladoria/liquidacoes/1
	def show
		@exibir_alerta_contexto = self.send(:exibir_alerta_de_contexto?, @liquidacao&.data_da_liquidacao)
	end

	# PATCH /controladoria/liquidacoes/1/retornar_para_administrativo
	def retornar_para_administrativo
		if @liquidacao.retornar_para_administrativo!
			redirect_to controladoria_liquidacao_url(@liquidacao), success: 'A liquidação foi enviada para a administração para correção dos erros.'
		else
			redirect_to controladoria_liquidacao_url(@liquidacao), alert: 'Não foi possível encaminhar a liquidação. Por favor, confira se ele contém erros'
		end
	end

	# PATCH /controladoria/liquidacoes/1/enviar_para_contabilidade
	def enviar_para_contabilidade
		if @liquidacao.enviar_para_contabilidade!
			redirect_to pendentes_controladoria_liquidacoes_path, success: 'A liquidação foi enviada para a contabilidade.'
		else
			redirect_to controladoria_liquidacao_url(@liquidacao), alert: 'Não foi possível encaminhar a liquidação. Por favor, confira se ele contém erros'
		end
	end

	# PATCH /controladoria/liquidacoes/1/enviar_para_administrativo
	def enviar_para_administrativo
		return if bloqueia_usuario_com_base_em 'update'
		if @liquidacao.enviar_para_administrativo!
			redirect_to controladoria_liquidacao_path(@liquidacao), success: 'A liquidação foi enviado para o setor administrativo.'
		else
			redirect_to controladoria_liquidacao_path(@liquidacao), alert: 'Não foi possível encaminhar a liquidação. Por favor, confira se ela contém erros'
		end
	end

	private
	def set_liquidacao
		@liquidacao = Contabilidade::Liquidacao.find(params[:id])
	end

	def disponibiliza_dependencias
		@meses = Contabilidade::Liquidacao.meses_da_folha
		@tipos_de_nota_fiscal = Contabilidade::Liquidacao.nota_fiscal_tipos.sort_by{ |tipo| tipo }
	end
end
