module Contabilidade
	class DiariasController < ApplicationController
		include ControllerConcern
		include DiariasHelper

		before_action -> { verifica_modulo_na_sessao(["contabilidade", "administrativo"]) }
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: %i[selecionar_dotacao adicionar_dotacao excluir_dotacao editar_dotacao]
		before_action :set_diaria, except: %i[index new create]
		before_action :disponibiliza_dependencias, only: %i[new create edit update selecionar_dotacao]
		before_action :disponibiliza_dependencias_dotacoes, only: %i[selecionar_dotacao adicionar_dotacao edit update]
		before_action -> { verifica_acesso_usuario(@diaria) }, except: %i[index new create]

		# GET /contabilidade/diarias
		def index
			@q = current_usuario.diarias.do_exercicio(exercicio_atual).ransack(query_params)
			@diarias = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)

			if current_usuario.desenvolvedor?
				@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order(:codigo, :nome)
			else
				@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).order(:codigo, :nome)
			end

		end

		# GET /contabilidade/diarias/new
		def new
			@diaria = contexto_atual.diarias.new
		end

		# POST /contabilidade/diarias
		def create
			@diaria = contexto_atual.diarias.new(diaria_params)

			if @diaria.save
				redirect_to create_diaria_path(@diaria), success: 'Diária foi criada com sucesso.'
			else
				flash.now[:alert] = 'Não foi possível criar a diária, verifique as informações.'
				render :new
			end
		end

		# GET /contabilidade/diarias/1
		def show
			if @diaria.empenho.present?
				if @diaria.empenho.existe_liquidacao_sem_estorno?
					@liquidacao = @diaria.empenho.liquidacoes.where(estornada: false).last
					if @liquidacao.existe_pagamento_sem_estorno?
						@pagamento = @liquidacao.pagamentos.where(estornado: false).last
					end
				end
			end
		end

		# GET /contabilidade/diarias/1/edit
		def edit
		end

		# PATCH/PUT /contabilidade/diarias/1
		def update
			if @diaria.update(diaria_params)
				redirect_to diaria_path(@diaria), success: 'Diária foi atualizada com sucesso.'
			else
				flash.now[:alert] = 'Não foi possível atualizar a diária, verifique as informações.'
				render :edit
			end
		end

		# DELETE /contabilidade/diarias/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@diaria)
			redirect_to diarias_path, mensagem
		end

		# GET /contabilidade/diarias/1/selecionar_dotacao
		def selecionar_dotacao
			return if bloqueia_usuario_com_base_em 'update'
			if @diaria.dotacao_inclusa?
				orcamento_da_despesa_por_diaria_id = @diaria.orcamento_da_despesa_por_diaria.id
				@orcamento_da_despesa_por_diaria = Contabilidade::OrcamentoDaDespesaPorDiaria.find(orcamento_da_despesa_por_diaria_id)
				disponibiliza_dependencias_dotacoes
				disponibiliza_subacao
			else
				@orcamento_da_despesa_por_diaria = Contabilidade::OrcamentoDaDespesaPorDiaria.new
			end
		end

		# POST /contabilidade/diarias/1/adicionar_dotacao
		def adicionar_dotacao
			return if bloqueia_usuario_com_base_em 'update'
			@orcamento_da_despesa_por_diaria = Contabilidade::OrcamentoDaDespesaPorDiaria.new(dotacao_da_diaria_params)

			if @orcamento_da_despesa_por_diaria.save
				redirect_to diaria_path(@diaria, tab: 'dotacao_da_diaria'), success: 'Dotação foi adicionada com sucesso.'
			else
				flash.now[:alert] = 'Não foi possível adicionar a dotação, verifique as informações.'
				disponibiliza_dependencias_dotacoes
				render :selecionar_dotacao
			end
		end

		# POST /contabilidade/diarias/1/atualiza_dotacao
		def atualiza_dotacao
			return if bloqueia_usuario_com_base_em 'update'
			@orcamento_da_despesa_por_diaria = @diaria.orcamento_da_despesa_por_diaria
			if @orcamento_da_despesa_por_diaria.update(dotacao_da_diaria_params)
				redirect_path = diaria_path(@diaria, tab: 'dotacao_da_diaria')
				redirect_to redirect_path, success: 'Dotação foi atualizada com sucesso.'
			else
				disponibiliza_dependencias_dotacoes
				render :selecionar_dotacao
			end
		end

		# DELETE /contabilidade/diarias/1/excluir_dotacao/1
		def excluir_dotacao
			return if bloqueia_usuario_com_base_em 'update'
			@orcamento_da_despesa_por_diaria = Contabilidade::OrcamentoDaDespesaPorDiaria.find(params[:orcamento_da_despesa_por_diaria_id])

			mensagem = apaga_e_retorna_mensagem(@orcamento_da_despesa_por_diaria)
			redirect_to diaria_path(@orcamento_da_despesa_por_diaria.diaria, tab: "dotacao_da_diaria"), mensagem
		end

		private

		def set_diaria
			@diaria = Diaria.find(params[:id])
		end

		def disponibiliza_dependencias
			@unidades_orcamentarias = current_usuario.unidades_orcamentarias.do_exercicio(exercicio_atual)
			@estados = Base::Estado.all
		end

		def disponibiliza_subacao
			@diaria.orcamento_da_despesa_por_diaria.elemento_de_despesa_por_subacao_id = @diaria.try(:orcamento_da_despesa_por_diaria).try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id)
			@diaria.orcamento_da_despesa_por_diaria.subacao_id = @diaria.try(:orcamento_da_despesa_por_diaria).try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id)
		end

		def disponibiliza_dependencias_dotacoes
			@orcamento_da_despesa_por_diaria = @diaria.orcamento_da_despesa_por_diaria
			@unidade_orcamentaria = [@diaria.unidade_orcamentaria]
			@elementos_de_despesa_por_subacao = []
			@orcamentos_da_despesa = []
			@sub_elementos_de_despesa = []
			@subacoes = []

			if @orcamento_da_despesa_por_diaria && @diaria.unidade_orcamentaria_id.present?
				@elementos_de_despesa_por_subacao = [@orcamento_da_despesa_por_diaria.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao)]
				@orcamentos_da_despesa = [@orcamento_da_despesa_por_diaria.try(:orcamento_da_despesa)]
				@sub_elementos_de_despesa = [@orcamento_da_despesa_por_diaria.try(:sub_elemento_de_despesa)]
				@subacoes = [@orcamento_da_despesa_por_diaria.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao)]
			else
				@subacoes = current_usuario.subacoes.do_exercicio(exercicio_atual).joins(elementos_de_despesa: :elemento_de_gasto).where(unidade_orcamentaria_id: @diaria.unidade_orcamentaria, natureza_da_despesa_elementos_de_despesa: {codigo: "14"} ).includes(acao: :natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
			end
		end

		# Permite apenas os parâmetros específicos
		def diaria_params
			params.require(:contabilidade_diaria).permit(
				:orcamento_id, :numero, :data_da_portaria, :qtd_de_diarias, :valor, :historico,
				:unidade_orcamentaria_id, :agente_publico_municipal_id, :numero_da_portaria,
				:cidade_id, :data_da_viagem, :data_do_retorno, :dotacao_na_diaria, :viagem_exterior, :local_exterior
			)
		end

		def dotacao_da_diaria_params
			params.require(:contabilidade_orcamento_da_despesa_por_diaria).permit(
				:unidade_orcamentaria_id, :subacao_id, :elemento_de_despesa_por_subacao_id, :sub_elemento_de_despesa_id,
				:orcamento_da_despesa_id, :valor, :diaria_id
			)
		end
	end
end
