class OrcamentosController < ApplicationController
	include ControllerConcern
	include LoaControllersConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:configuracoes_eventos_contabeis_update, :busca_por_projecao_de_receita]
	before_action :set_orcamento, except: [:index, :new, :create]
	before_action :disponibiliza_dependencias, only: [:new, :edit]

	skip_before_action :verifica_se_sessao_eh_de_contabilidade, only: [:index]

	# GET /orcamentos
	def index
		@q = Orcamento.order(:exercicio).ransack(query_params)
		@orcamentos = @q.result(distinct: false).reverse_order.paginate(page: params[:page], per_page: 10)
		@params = {tipo: "Orcamento"}
		if (params[:contabilidade])
			@params.merge!(modulo: "Contabilidade")
			@modulo = "Contabilidade"
		elsif params[:modulo] == 'Licitacao'
			@params.merge!(modulo: "Licitacao")
			@modulo = "Licitacao"
		elsif params[:modulo] == 'Administrativo'
			@params.merge!(modulo: "Administrativo")
			@modulo = "Administrativo"
		elsif params[:modulo] == 'Planejamento'
			@params.merge!(modulo: "Planejamento")
			@modulo = "Planejamento"
		elsif params[:modulo] == 'Obra'
			@params.merge!(modulo: "Obra")
			@modulo = "Obra"
		elsif params[:modulo] == 'Gestao_de_estoque'
			@params.merge!(modulo: "Gestao_de_estoque")
			@modulo = "Gestao_de_estoque"
		elsif params[:modulo] == 'patrimonio'
			@params.merge!(modulo: "patrimonio")
			@modulo = "patrimonio"
		else
			@modulo = "Orcamento"
		end
	end

	# GET /orcamentos/1
	def show
		@status = I18n.t "status_do_orcamento"
	end

	# GET /orcamentos/new
	def new
		@orcamento = Orcamento.new
		@projecoes = Projecao::ProjecaoDeReceita.all
	end

	# GET /orcamentos/2016/edit
	def edit
	end

	# POST /orcamentos
	def create

		@orcamento = Orcamento.new(orcamento_params)
		@orcamento.status = :gerando_dependencias
		respond_to do |format|
			if @orcamento.save
				session[:contexto_id] = @orcamento.id
				session[:contexto_tipo] = @orcamento.class.name

				format.html{ redirect_to @orcamento, notice: 'Orcamento foi criado com sucesso.' }
				format.json{ render json: @orcamento, status: :created, location: @orcamento }
			else
				disponibiliza_dependencias
				format.html{ render :new }
				format.json{ render json: @orcamento.errors, status: :unprocessable_entity}
			end
		end
	end

	# PATCH/PUT /orcamentos/2016
	def update
		if params[:finalizar].present?
			if finalizacao_params[:data_de_envio].blank? || finalizacao_params[:data_de_aprovacao].blank? || finalizacao_params[:data_de_publicacao].blank? || finalizacao_params[:numero_da_lei].blank?
				redirect_to orcamento_finalizar_path(@orcamento.exercicio), alert: 'Preencha todos os campos.'
			else
				if @orcamento.update(finalizacao_params.merge({status: :fechado}))
					redirect_to @orcamento, notice: 'Orçamento foi finalizado com sucesso.'
				else
					disponibiliza_dependencias
					render :finalizar
				end
			end
		else
			if @orcamento.update(orcamento_params)
				redirect_to @orcamento, notice: 'Orcamento foi atualizado com sucesso.'
			else
				disponibiliza_dependencias
				render :edit
			end
		end
	end

	# DELETE /orcamentos/2016
	def destroy
		if verifica_administrador
			if current_usuario.valid_password?params[:senha_administrador]

				ActiveRecord::Base.transaction do
					@orcamento.tipos_de_deducao.delete_all
					@orcamento.naturezas_da_receita.where(padrao: true).delete_all
					@orcamento.contas_extra_orcamentarias.where(padrao: true).delete_all
					@orcamento.contas.where(importada_do_pcasp: true).delete_all
					@orcamento.reload

					mensagem = apaga_e_retorna_mensagem(@orcamento)

					if mensagem[:alert].present?
						redirect_to @orcamento, mensagem
						raise ActiveRecord::Rollback
					else
						session[:contexto_id] = nil
						session[:contexto_tipo] = nil
						redirect_to orcamentos_path, mensagem
					end
				end
			else
				redirect_to orcamento_atual, alert: 'Senha invalida'
			end
		else
			redirect_to orcamento_atual, notice:'Você não é administrador desse sistema'
		end
	end

	def configuracoes_eventos_contabeis
		@orcamento =  Orcamento.find_by(exercicio: params[:exercicio])
		@acoes_do_sistema = Contabilidade::AcaoDoSistema.all
	end

	def configuracoes_eventos_contabeis_update
		autoriza_usuario!('configuracoes_eventos_contabeis', "orcamentos")

		@orcamento =  Orcamento.find_by(exercicio: params[:exercicio])
		eventos_padroes_ids = params[:eventos_contabeis].values
		@orcamento.eventos_contabeis.update_all(padrao: false)

		if @orcamento.eventos_contabeis.where( id: eventos_padroes_ids ).update_all(padrao: true) > 0
			redirect_to contabilidade_eventos_contabeis_path( contabilidade_atual ), notice: 'Eventos padrões das ações do sistema atualizados com sucesso.'
		else
			redirect_to contabilidade_eventos_contabeis_path( contabilidade_atual ), alert: 'Nenhum evento foi definido como padrão para as respectivas ações do sistema.'
		end
	end

	def finalizar
		@orcamento = Orcamento.find_by(exercicio: params[:orcamento_exercicio] )
		@dados = get_dados_da_validacao_do_orcamento

		respond_to do |format|
			format.html
			format.pdf do
				render pdf: "incosistências_do_orçamento_#{@orcamento.exercicio}",
					orientation: 'Portrait',
					disable_smart_shrinking: true,

					dpi: '96',
					header: { html:
						{ template: 'layouts/_cabecalho_pdf.html.slim',
							locals:   { titulo1:  'Lei Orçamentária Anual ' + orcamento_atual.exercicio.to_s , titulo2: "Lista de Inconsistências" }
						},
						spacing: 5
					}
				end
		end
	end

	def alterar_status
		opcao = alteracoes_de_status_params[:opcao]

		if (@orcamento.aberto? || @orcamento.em_alteracao?) && opcao != 'aprovar'
			if @orcamento.enviar_para_votacao!
				redirect_to orcamento_path(@orcamento), notice:'PLOA enviado para votação'
			else
				redirect_to orcamento_path(@orcamento),alert:'PLOA NÂO foi enviado para votação, verifique se o mesmo possui alguma informação pendente e se está com o status ABERTO ou EM ALTERAÇÃO para prosseguir'
			end

		elsif @orcamento.enviado_para_votacao? && opcao == 'alterar_status'
			if @orcamento.enviar_para_alteracao!
				redirect_to orcamento_path(@orcamento), notice:'PLOA pode ser Alterado '
			else
				redirect_to orcamento_path(@orcamento), alert:'PLOA não tem autorização para ser Alterado, verifique o mesmo possui alguma informação pendente e se está com o status ENVIADO PARA VOTAÇÂO'
			end

		elsif (@orcamento.conferindo_geracao?) && opcao == 'alterar_status'
			if @orcamento.finalizar_conferencia!
				redirect_to orcamento_path(@orcamento), notice:'PLOA foi liberado para ser Alterado'
			else
				redirect_to orcamento_path(@orcamento), alert:'PLOA não tem autorização para ser Alterado, verifique o mesmo possui alguma informação pendente e se está com o status CONFERINDO ALTERAÇÕES'
			end

		elsif (@orcamento.enviado_para_votacao? || @orcamento.aberto?) && opcao == 'aprovar'
			if @orcamento.aprovar!
				redirect_to orcamento_path(@orcamento), notice:'PLOA foi Aprovado com sucesso'
			else
				redirect_to orcamento_path(@orcamento) ,alert: 'PLOA não foi aprovado, verifique se o mesmo possui alguma informação pendente e se está com o status ABERTO ou ENVIADO PARA VOTAÇÂO'
			end

		elsif @orcamento.aprovado?
			if @orcamento.encerrar!
				redirect_to orcamento_path(@orcamento), notice:'LOA encerrado com sucesso'
			else
				redirect_to orcamento_path(@orcamento) ,alert: 'Não foi possivel encerrar o LOA, verifique se o mesmopossui alguma informação pendente e se está com o status APROVADO'
			end
		end

		unless @orcamento.errors.present?
			alteracoes_de_status = Loa::AlteracaoDeStatus.new(alteracoes_de_status_params.reject { |k| k if k == "opcao" })
			alteracoes_de_status.orcamento_id = @orcamento.id
			alteracoes_de_status.usuario_id = current_usuario.id
			alteracoes_de_status.status = @orcamento.status
			if alteracoes_de_status.save
			end
		end
	end

	def encerrar_plano_de_contas
		if @orcamento.update(orcamento_params)
			redirect_to contabilidade_relatorios_pcasp_index_path, notice: 'Plano de contas encerrado'
		else
			redirect_to contabilidade_relatorios_pcasp_index_path, alert: 'Não foi possivel encerrar o plano de contas'
		end
	end

	private
	def set_orcamento
		@orcamento = orcamento_atual
	end

	def disponibiliza_dependencias
		@projecoes = Projecao::ProjecaoDeReceita.all
		@ppas = Ppa::Ppa.all
	end

	def orcamento_params
		params.require(:orcamento).permit(:percentual_despesa_com_pessoal, :percentual_do_duodecimo, :superavit_financeiro,
			:data_de_publicacao, :trabalhar_com_iduso, :exercicio, :percentual_da_reserva_de_contingencia,
			:utilizar_projecao_do_ppa, :arquivo_de_contexto, :trabalha_com_subacao, :percentual_normativo_da_ldo,
			:ppa_id, :importar_orgaos, :importar_acoes, :importar_despesas, :prefeito, :vice_prefeito, :opcao, 
			:plano_de_contas_encerrado, :numero_da_lei, :numero_ldo, :por_cotas, :docc_centralizado, :obrigatorio_meta_fisica,
			:prazo_inicial_proposta_setorial, :prazo_final_proposta_setorial,
			temas_do_orcamento_attributes: [:id, :orcamento_tematico_id, :ativo, :orcamento_id]).merge({criar_classificacoes_da_despesa: true})
	end

	def finalizacao_params
		params.require(:orcamento).permit(:data_de_publicacao, :data_de_aprovacao, :data_de_envio, :exercicio, :numero_da_lei)
	end

	def alteracoes_de_status_params
		params.require(:loa_alteracao_de_status).permit( :data_de_alteracao, :opcao )
	end
end
