class PpaParticipativo::InicioController < ApplicationController
	include PpaParticipativoControllersConcern

	layout 'ppa_participativo/application'
	helper_method :resource_name, :resource, :devise_mapping

	before_action :verifica_ppa_participativo_ativo, only: [:participe, :propostas, :visualizar_propostas, :envia_proposta, :votar, :envia_votos]
	before_action :verifica_envio_de_propostas_liberado, only: [:propostas, :envia_proposta]
	before_action :verifica_envio_de_votos_liberado, only: [:votar, :envia_votos]
	before_action :authenticate_cidadao!, unless: :skip_authenticate_user
	skip_before_action :authenticate_usuario!, raise: false

	before_action :verifica_liberacao_do_ppa_participativo, only: :index
	before_action :verifica_abertura_do_periodo_de_propostas_e_votacao, only: :participe

	def resource_name
		:cidadao
	end

	def resource
		@resource ||= PpaParticipativo::Cidadao.new
	end

	def devise_mapping
		@devise_mapping ||= Devise.mappings[:cidadao]
	end

	def index
		redirect_to ppa_participativo_participe_path if cidadao_signed_in?
	end

	def participe
		@configuracao = Configuracao.last
	end

	def propostas
		@configuracao = Configuracao.last
		@propostas = Ppa::Proposta.where(cidadao_id: current_cidadao.id, ppa_id: @ppa_atual.id).all
		@proposta = @ppa_atual.propostas.new(cidadao_id: current_cidadao.id)

		@areas_tematicas = @ppa_atual.areas_tematicas
		@sub_areas_tematicas = Array.new
		@regioes = @ppa_atual.regioes
		@micro_regioes = @ppa_atual.ativar_somente_micro_regiao ? @ppa_atual.micro_regioes : Array.new
	end

	def visualizar_propostas
		@configuracao = Configuracao.last
		@propostas = current_cidadao.propostas.where(is_problema: false).order(:id)
	end

	def envia_proposta
		@configuracao = Configuracao.last
		@propostas = Ppa::Proposta.where(cidadao_id: current_cidadao.id).all
		@proposta = @ppa_atual.propostas.new(proposta_params)
		@proposta.cidadao = current_cidadao

		if @proposta.save
			mensagem = proposta_params[:is_problema].eql?('true') ? 'Problema foi enviado com sucesso, obrigado por participar!' : 'Proposta foi enviada com sucesso, obrigado por participar.'
			redirect_to ppa_participativo_propostas_path, notice: mensagem
		else
			@regioes = @ppa_atual.regioes
			@areas_tematicas = @ppa_atual.areas_tematicas
			@micro_regioes = @proposta.regiao_id.present? ? Ppa::MicroRegiao.where(regiao_id: @proposta.regiao_id).all : @ppa_atual.micro_regioes
			@sub_areas_tematicas = Ppa::SubAreaTematica.where(area_tematica_id: @proposta.area_tematica_id).all if @proposta.area_tematica_id.present?

			@sub_areas_tematicas = Array.new if @sub_areas_tematicas.nil?
			@micro_regioes = Array.new if @micro_regioes.nil?
			@is_problema = @proposta.is_problema
			render :propostas
		end
	end

	def votar
		@configuracao = Configuracao.last
		@regioes = @ppa_atual.regioes
	end

	def envia_votos
		propostas_votadas = params[:proposta]
		if propostas_votadas.nil?
			redirect_to ppa_participativo_votar_path, alert: 'Nenhuma proposta foi selecionada.'
		else
			votos_validos = 0
			propostas_votadas.each do |chave, valor|
				voto = Ppa::VotoDaProposta.new(proposta_id: chave, cidadao: current_cidadao)
				if voto.save
					votos_validos += 1
				end
			end
			redirect_to ppa_participativo_votar_path, notice: "#{votos_validos} voto(s) enviado(s), obrigado pela participação."
		end
	end

	private
	def verifica_liberacao_do_ppa_participativo
		@configuracao = Configuracao.last
		@ppa_atual = Ppa::Ppa.find_by(ppa_participativo_ativo: true) || Ppa::Ppa.where.not(abertura_do_periodo_de_propostas: nil, fim_do_periodo_de_propostas: nil).last || Ppa::Ppa.where.not(abertura_do_periodo_de_votacao: nil, fim_do_periodo_de_votacao: nil).last
		if @ppa_atual && !@ppa_atual.ppa_participativo_ativo
			if @ppa_atual.abertura_do_periodo_de_propostas
				@ppa_atual.update_column('ppa_participativo_ativo', true) if Date.today.in?(@ppa_atual.abertura_do_periodo_de_propostas..@ppa_atual.fim_do_periodo_de_propostas)
			elsif @ppa_atual.abertura_do_periodo_de_votacao
				@ppa_atual.update_column('ppa_participativo_ativo', true) if Date.today.in?(@ppa_atual.abertura_do_periodo_de_votacao..@ppa_atual.fim_do_periodo_de_votacao)
			end
		end
	end

	def verifica_abertura_do_periodo_de_propostas_e_votacao
		@ppa_atual = Ppa::Ppa.find_by(ppa_participativo_ativo: true)
		if @ppa_atual.abertura_do_periodo_de_propostas
			if Date.today.in?(@ppa_atual.abertura_do_periodo_de_propostas..@ppa_atual.fim_do_periodo_de_propostas)
				@ppa_atual.update_column('libera_propostas', true) unless @ppa_atual.libera_propostas
			else
				@ppa_atual.update_column('libera_propostas', false) if @ppa_atual.libera_propostas
			end
		end

		if @ppa_atual.abertura_do_periodo_de_votacao
			if Date.today.in?(@ppa_atual.abertura_do_periodo_de_votacao..@ppa_atual.fim_do_periodo_de_votacao)
				@ppa_atual.update_column('libera_votacao', true) unless @ppa_atual.libera_votacao
			else
				@ppa_atual.update_column('libera_votacao', false) if @ppa_atual.libera_votacao
			end
		end
	end

	def verifica_envio_de_propostas_liberado
		redirect_to ppa_participativo_participe_path unless @ppa_atual.libera_propostas
	end

	def verifica_envio_de_votos_liberado
		redirect_to ppa_participativo_participe_path unless @ppa_atual.libera_votacao
	end

	def verifica_ppa_participativo_ativo
		@ppa_atual = Ppa::Ppa.find_by(ppa_participativo_ativo: true)
		redirect_to ppa_participativo_path unless @ppa_atual.present?
	end

	def proposta_params
		params.require(:ppa_proposta).permit(:descricao, :cidadao_id, :area_tematica_id, :sub_area_tematica_id, :regiao_id, :micro_regiao_id, :ppa_id, :problema, :is_problema)
	end

	protected
	def skip_authenticate_user
		action_name=='index'
	end
end
