module DiaryHelper
	# MÉTODOS PARA CONTROLADOR :SET

	# Los valores están guardados por comidas de un día separados por |
	# ej: 212|000|.. es igual a [[2,1,2], [0,0,0]...]
	# Cada número representa una comida, y su valor es correspondiente a:
	# 0: No registrado
	# 1: Me quedé con hambre
	# 2: Quedé satisfecho
	# 3: Quedé empachado / Comí de más
	# @return {matrix} [[x,x,x],[x,x,x],...]
	def registro_diario(plan)
		# Un primer split en | para separar las comidas por días
		registro = plan.meals_record.split("|")
		# Actualizamos los valores de cada día separando las comidas y guardando su respectivo índice, es el orden de aparición de comidas.
		# Este orden lo crea Ricardo desde que hace el plan, así que el orden es 'universal'
		registro.each_with_index { |m, index| registro[index] = m.split("") }
		# Si el día actual para registrar es superior al total de registros existentes,
		# esto quiere decir que el entrenador alargó el plan, así que para ese caso generamos los espacios necesarios
		if plan.current_day > registro.count 
			days_extra = (plan.current_day - registro.count)
			# Calculados los días extra, generamos las comidas por día extra, 
			# todas seteadas en 0 ya que hasta este momento no existirían, por lo tanto no deberían tener ningún registro
			days_extra.times { |d| registro << ("0" * plan.meals.count).split("") }
		end
		return registro
	end

	def meals_average(plan)
		values_for_day = registro_diario(plan)[0,plan.current_day+1]
		# Se recorren todos los días, cada día contiene un grupo de 3 comidas
		values_for_meal = []
		y_labels = []
		values_for_day.each_with_index do |meals, idx|
			# Sólo añadimos al arreglo si es el primer día o si se registraron las comidas del día
			# Si no se registró ninguna comida no tiene caso graficar
			if meals.join("").to_i != 0 || idx == 0
				y_labels << l(plan.init + (idx).days, format: '%d/%^b/%y')
				values_for_meal << meals.map { |m| (m.to_i || 0) }
			end
		end
		# total de comidas en el plan
		total_meals = plan.meals.count
		# son 3 los valores para evaluar, hambre, satisfecho, empachado
		# Ordenamos para gráfica
		values = Array.new(plan.meals.count) { [] }
		values_for_meal.each do |meals|
			total_meals.times { |n| values[n] << (meals[n] || '0') }
		end
		return y_labels, values
	end

	# @return {String} Registro de comidas
	def format_meals_record(registro)
		record = []
		# Unimos en un string los valores de comida por día
		registro.each { |m| record << m.join("") }
		# Unimos en un string los días separados por |
		return record.join("|")
	end

	# COMENTARIOS / DIARIO.
	# Método para rutas :notas_alimentacion, :notas_entrenamiento
	def plan_notes(plan, notas)
		registro = notas.to_s.split("|")
		if plan.current_day > registro.count 
			days_extra = (plan.current_day - registro.count)
			days_extra.times { |d| registro << "" }
		end
		return registro
	end

	def registro_rutina(rutina)
		registro = rutina.history.to_s.split("|")
		plan = rutina.plan
		if plan.current_day > registro.count 
			days_extra = (plan.current_day - registro.count)
			days_extra.times { |d| registro << "" }
		end
		return registro
	end

	def registro_carga(routine_workout)
		registro = routine_workout.history.to_s.split("|")
		plan = routine_workout.routine.plan
		if plan.current_day > registro.count 
			days_extra = (plan.current_day - registro.count)
			days_extra.times { |d| registro << "" }
		end
		return registro
	end

	# MÉTODOS PARA VISTAS :GET
	def diario(user, tipo)
		days = []
		user.plans.order(finish: :asc).each do |plan|
			comments = tipo == "alimentacion" ? plan.comments : plan.sessions_notes
			days = days.concat(comments_by_plan(plan, comments.to_s.split("|")))
		end
		return days
	end

	def comments_by_plan(_plan, _comments)
		days = []
		_comments.each_with_index do |comment, idx|
			messages = comment.to_s.split("~")
			if messages.any?
				date = _plan.init + idx.days
				text_date = date.strftime('%d/%m/%y')
				# text_date = I18n.localize(date, format: '%d/%b/%y').titleize
				days << { date: text_date, comments: messages }
			end
		end
		return days.reverse
	end

end