"""
The MIT License (MIT)
Copyright © 2021 Walkline Wang (https://walkline.wang)
Gitee: https://gitee.com/walkline/micropython-new-fontlib
"""
from libs.fontlib import FontLib
from utime import ticks_diff, ticks_us


fontlib = None

chars =\
'''  问题,到底应该如何实现。
  既然如此,我们都知道,只要有意义,那么就必须慎重考虑。
  现在,解决问题的问题,是非常非常重要的。
  所以,在这种困难的抉择下,本人思来想去,寝食难安。
  要想清楚,问题,到底是一种怎么样的存在。
  一般来说,生活中,若问题出现了,我们就不得不考虑它出现了的事实。
  维龙曾经说过,要成功不需要什么特别的才能,只要把你能做的小事做得好就行了。
  这似乎解答了我的疑惑。
  这种事实对本人来说意义重大,相信对这个世界也是有一定意义的。'''

def list_bin_files(root):
	import os

	def list_files(root):
		files=[]
		for dir in os.listdir(root):
			fullpath = ('' if root=='/' else root)+'/'+dir
			if os.stat(fullpath)[0] & 0x4000 != 0:
				files.extend(list_files(fullpath))
			else:
				if dir.endswith('.bin'):
					files.append(fullpath)
		return files

	return list_files(root)

def choose_a_file(file_list):
	print('\nFile list')
	for index,file in enumerate(file_list, start=1):
		print('    [{}] {}'.format(index, file))
	
	selected=None
	while True:
		try:
			selected=int(input('Choose a file: '))
			print('')
			assert type(selected) is int and 0 < selected <= len(file_list)
			break
		except KeyboardInterrupt:
			break
		except:
			pass

	if selected:
		return selected
	else:
		return


if __name__ == '__main__':
	font_files = list_bin_files('/')
	if not len(font_files): print('no font file found')

	selected = choose_a_file(font_files)
	if not selected: exit(1)

	start_time = ticks_us()
	fontlib = FontLib(font_files[selected - 1])
	print('### load font file: {} ms'.format(ticks_diff(ticks_us(), start_time) / 1000))
	fontlib.info()

	start_time = ticks_us()
	buffer_list = fontlib.get_characters(chars)
	diff_time = ticks_diff(ticks_us(), start_time) / 1000
	print('\n### method: load all')
	print('### {} chars, get {} chars: {} ms, avg: {} ms'.format(len(chars), len(buffer_list), diff_time, diff_time / len(buffer_list)))

	print('\n### method separated')
	chunk = 24
	char_count = time_count = avg_count = 0
	for count in range(0, len(chars) // chunk + 1):
		sep_chars = chars[count * chunk:count * chunk + chunk]

		start_time = ticks_us()
		buffer_list = fontlib.get_characters(sep_chars)
		diff_time = ticks_diff(ticks_us(), start_time) / 1000
		if not buffer_list: continue
		
		avg_time = diff_time / len(buffer_list)

		char_count += len(buffer_list)
		avg_count += avg_time
		time_count += diff_time
		print('### {} get {} chars: {} ms, avg: {} ms'.format(count, len(buffer_list), diff_time, avg_time))

	print('### {} chars, get {} chars: {} ms, avg: {} ms'.format(len(chars), char_count, time_count, avg_count / (count-1)))