module Contabilidade
	class DecretosController < ApplicationController
		include ControllerConcern
		include Contabilidade::DecretosHelper

		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: [:retorna_dados_da_legislacao]
		before_action :set_decreto, only: [:show, :edit, :update, :destroy, :fechar, :revogar_decreto, :retorna_dados_da_legislacao,:retornar_para_solicitado]
		before_action :disponibiliza_dependencias, only: [:create, :new, :update, :edit, :index]
		before_action -> {verifica_mes_bloqueado(@decreto) if @decreto.fechado? && !@decreto.rpps? }, only: [:edit, :update, :destroy, :fechar, :revogar_decreto,:retornar_para_solicitado]

		# GET /contabilidade/decretos
		def index
			@url_decretos = contabilidade_decretos_path
			@action_decretos = ""

			if params[:contigenciamento]
				@url_decretos = decretos_contigenciamento_contabilidade_decretos_path
				decretos = contexto_atual.decretos.order(data_da_legislacao: :desc).where(tipo_de_decreto: 1)
				@action_decretos = "contigenciamento"
			elsif params[:rpps]
				@url_decretos = decretos_rpps_contabilidade_decretos_path
				decretos = Contabilidade::Decreto.order(data_da_legislacao: :desc).where(tipo_de_decreto: 2)
				@action_decretos = "rpps"
			else
				decretos = contexto_atual.decretos.order(data_da_legislacao: :desc).where(tipo_de_decreto: 0)
			end

			@q = decretos.order(:id).search(params[:q])
			@decretos = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		end

		# GET /contabilidade/decretos/1
		def show
		end

		# GET /contabilidade/decretos/new
		def new
			@decreto = contexto_atual.decretos.new
			@decreto.numero_da_lei = contexto_atual.numero_da_lei
			@decreto.numero_ldo = contexto_atual.numero_ldo
		end

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

		# POST /contabilidade/decretos
		def create
			if params[:contabilidade_decreto][:tipo_de_decreto] == "rpps"
				@decreto = Decreto.new(decreto_params.merge(status: :fechado, numero_da_lei: nil, numero_ldo: nil))
			else
				@decreto = Decreto.new(decreto_params)
			end

			@decreto.orcamento = contexto_atual

			if @decreto.save
				redirect_to rota_decreto(@decreto), notice: 'Decreto foi criado(a) com sucesso.'
			else
				if params[:contabilidade_decreto][:contigenciamento].present?
					params[:contigenciamento] = true
				elsif params[:contabilidade_decreto][:tipo_de_decreto] == "rpps"
					params[:rpps] = true
				end
				render :new
			end
		end

		# PATCH/PUT /contabilidade/decretos/1
		def update
			if @decreto.update( decreto_params )
				redirect_to rota_decreto(@decreto), notice: 'Decreto foi atualizado(a) com sucesso.'
			else
				render :edit
			end
		end

		# DELETE /contabilidade/decretos/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@decreto)
			redirect_to rota_decretos(@decreto), mensagem
		end

		# PATCH /decreto/1/enviar_para_contabilidade
		def fechar
			if @decreto.fechar!
				redirect_to rota_decreto(@decreto), success: 'O decreto foi fechado.'
			else
				redirect_to rota_decreto(@decreto), alert: 'Não foi possível fechar o decreto. Por favor, confira se ele contém erros'
			end
		end

		def revogar_decreto
			return if bloqueia_usuario_com_base_em 'update'

			if params[:data_da_revogacao] != "" && params[:numero_revogado] != ""
				@decreto.update(numero_revogado: params[:numero_revogado],data_da_revogacao: params[:data_da_revogacao])
				redirect_to @decreto, notice: 'Decreto foi revogado com sucesso.'
			else
				redirect_to @decreto, notice: 'Preencha os campos pedidos para extinguir o comitê'
			end
		end
		
		def retornar_para_solicitado
			@decreto.status = Contabilidade::Decreto.status[:solicitado]
			
			if @decreto.save(validate: false)
				redirect_to rota_decreto(@decreto), success: 'O decreto foi retornado para edição.'
			else
				redirect_to rota_decreto(@decreto), alert: 'Não foi possível retornar o decreto. Por favor, confira se ele contém erros.'
			end
		end

		def disponibiliza_dependencias
			@tipos_de_credito = Contabilidade::Decreto.tipo_de_creditos
			@funcoes_do_instrumento_legal = Contabilidade::Decreto.funcoes_do_instrumento_legal
			@origem_do_recurso = Contabilidade::SolicitacaoDeAlteracaoOrcamentaria.origens_dos_recursos
			@status = Contabilidade::Decreto.status

			if params[:rpps].present? || (params[:contabilidade_decreto].present? && params[:contabilidade_decreto][:tipo_de_decreto].present? && params[:contabilidade_decreto][:tipo_de_decreto] == "rpps" )
				@tipos_de_legislacao = Contabilidade::Decreto.tipo_de_legislacoes.select { |clas| clas != 'oficio'}
			else
				@tipos_de_legislacao = Contabilidade::Decreto.tipo_de_legislacoes
			end

			if params[:contigenciamento].present? || (params[:contabilidade_decreto].present? && params[:contabilidade_decreto][:contigenciamento].present?)
				@classificacoes = Contabilidade::Decreto.classificacoes.select { |clas| clas.eql?('orcamentario') || clas.eql?('financerio')}
			else
				@classificacoes = Contabilidade::Decreto.classificacoes.select { |clas| clas != 'orcamentario' && clas != 'financerio'}
			end
		end


		# GET contabilidade/decreto/id/dados_da_legislacao
		def retorna_dados_da_legislacao
			render json: {
				'data_de_publicacao': @decreto.data_da_publicacao.to_s,
				'data_da_legislacao': @decreto.data_da_legislacao.to_s,
				'data_da_lei_autorizativa': @decreto.data_da_lei_autorizativa.to_s,
				'tipo_de_legislacao': @decreto.tipo_de_legislacao,
				'numero': @decreto.numero
			}
		end

		private
		def set_decreto
			if params[:decreto_id].present?
				@decreto = Decreto.find( params[:decreto_id] )
			else
				@decreto = Decreto.find( params[:id] )
			end
		end

		# Permite apenas os parâmetros específicos
		def decreto_params
			params.require(:contabilidade_decreto).permit(:data_da_lei_autorizativa, :data_da_legislacao, :numero_da_lei, :numero_revogado, :data_da_revogacao,:data_da_publicacao,:funcao_do_instrumento_legal,:ementa_do_instrumento_legal,:tipo_de_decreto, :tipo_de_legislacao, :numero, :objetivo, :classificacao, :tipo_de_credito, :numero_ldo, :lei_autorizativa, :numero_da_lei_sim)
		end
	end
end
