module ChronologyHelper

	# El dato para fecha se formatea después de haberse ordenado
	# Se le da salida a string para las etiquetas de la gráfica
	def format_date(date)
		I18n.localize(date, format: '%b %y').titleize
	end

	def format_values(values)
		return values.uniq.sort_by{ |p| p[1] }.map { |e| [e[0], format_date(e[1])] }
	end

	def chronology(user, category)
		case category
		when "macros"
			return macros_chron(user)
		when "corporal_fat"
			return corporal_fat_chron(user)
		when "weight"
			return weight_chron(user)
		when "gallery"
			return gallery_chron(user)
		when "notes"
			return notes_chron(user)
		when "circunferences"
			return circunferences(user)
		end
	end

	def macros_chron(user)
		values = []
		user.plans.where.not(finish: nil).order(init: :asc).each do |p|
			if p.macros_protein.present? && p.macros_carbs.present? && p.macros_fats.present? && p.macros_protein.to_s.to_f > 0.0 && p.macros_carbs.to_s.to_f > 0.0 && p.macros_fats.to_s.to_f > 0.0
				_date = format_date(p.finish.to_date)
				_prot = p.macros_protein
				_carbs = p.macros_carbs
				_fats = p.macros_fats
				values << [_date, _prot, _carbs, _fats]
			end
		end
		return values
	end
	
	def circunferences(user)
		values = []
		user.plans.where.not(finish: nil).order(init: :asc).each do |p|
			if	!p.arm_left.nil? && !p.arm_right.nil? && !p.chest.nil? && !p.waist.nil? && !p.thight_left.nil? && !p.thight_right.nil? && !p.gluteus.nil? && !p.calf_left.nil? && !p.calf_right.nil?
				_date = format_date(p.finish.to_date)
				values << [_date, p.arm_left, p.arm_right, p.chest, p.waist, p.thight_left, p.thight_right, p.gluteus, p.calf_left, p.calf_right]
			end
		end
		return values
	end

	def weight_chron(user)
		values = []
		user.plans.where.not(finish: nil).order(init: :asc).each { |p| values << [p.kg.to_f, p.init.to_date] if !p.kg.blank? && p.kg.to_i != 0 }
		return format_values(values)
	end

	def corporal_fat_chron(user)
		values = []
		user.plans.order(init: :asc).each { |p| values << [p.corporal_fat.to_f, p.init.to_date] if (!p.corporal_fat.blank? && p.corporal_fat.to_i > 0.0) }
		return format_values(values)
	end

	# Se formatean fotos de frente, perfil, espalda
	def get_photos(object, date)
		values = [[], date.to_date]
		values[0] << object.front if object.front.present?
		values[0] << object.side if object.side.present?
		values[0] << object.back if object.back.present?
		return values
	end

	def gallery_chron(user)
		values = []
		# Comentado, necesitamos saber si el usuario las sube cuando se registra, o después, 
		# si las sube después, la fecha es érronea, se verá mal acomodado el gráfico
		# photos = get_photos(user, user.created_at)
		# values << photos if photos[0].count > 0
		user.plans.order(init: :asc).each do |p|
			photos = get_photos(p, p.init)
			values << photos if photos[0].count > 0
		end
		return values
	end

	def notes_chron(user)
		values = []
		user.plans.where.not(finish: nil).order(init: :asc).each { |p| values << [p.comments, p.finish.to_date] if !p.comments.blank? }
		return format_values(values)
	end

end