from math import sqrt, ceil
from PIL import Image
from os import listdir, mkdir, remove
from shutil import rmtree
from os.path import join, splitext
from urllib.request import urlretrieve
from zipfile import ZipFile
from tempfile import mkdtemp
import sys
URL = 'https://downloads.gosquared.com/pixels/flags.zip'
IMG_PATH = 'flags-iso/flat'
SIZE = 32
CLASS_NAME = 'kz-flag'
TARGET = 'flags'
def isImage(filename):
	try:
		im = Image.open(filename)
		return True
	except:
		return False
def process(path):
	html = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
	<title>Flags</title>
	<style>
		body { background-color: #444; }
		body > div { display: flex; flex-wrap: wrap; }
		body > div div {
		    margin: 5px;
		    background: #e8e8e8;
		    text-align: center;
		    padding: 0 2px;
		}
	</style>
	<link rel="stylesheet" href="%s.css" />
</head>
<body>
<div>
''' % TARGET
	css = '''
.%s {
	/* Auto-build by flags.py */
	display: block;
	width: %dpx;
	height: %dpx;
	background-image: url('%s.png');
	background-color: #eee;
}
''' % (CLASS_NAME, SIZE, SIZE, TARGET)
	files = [f for f in listdir(path) if isImage(join(path, f))]
	xMax = int(sqrt(len(files)) + 1)
	yMax = ceil(len(files) / xMax)
	sprite = Image.new("RGBA", (SIZE * xMax , SIZE * yMax))
	for i, f in enumerate(files):
		im = Image.open(join(path, f))
		col = SIZE * (i % xMax)
		row = SIZE * int(i / xMax)
		(fn, ext) = splitext(f)
		sprite.paste(im, (col, row))
		css += ".%s.%s { background-position: %4dpx %4dpx; }\n" % (CLASS_NAME, fn, -col, -row)
		html +=  '<div><span class="%s %s"> </span><span>%s</span></div>\n' %(CLASS_NAME, fn, fn)
	html += '''</div>
</body>
</html>
'''
	
	sprite.save('%s.png' % TARGET, 'png')
	print('%s.png built' % TARGET)
	
	with open('%s.html' % TARGET, 'w') as f:
		f.write(html)
		print('%s.html built' % TARGET)
	
	with open('%s.css' % TARGET, 'w') as f:
		f.write(css)
		print('%s.css built' % TARGET)
def progressbar(block, count, total):
	bar_len = 60
	filled_len = int(round(bar_len * count / total))
	percents = round(100.0 * count / total, 1)
	bar = '=' * filled_len + '-' * (bar_len - filled_len)
	
	sys.stdout.write('[%s] %3d\r' % (bar, percents))
	sys.stdout.flush()
def main(args):
	print('Downloading ' + URL + ' ...')
	filename, headers = urlretrieve(URL, reporthook=progressbar)
	print('')
	if headers.get_content_type() == 'application/zip':
		print('Unzip ' + filename)
		tempdir = mkdtemp()
		with ZipFile(filename) as f:
			f.extractall(tempdir)
		process(join(tempdir, IMG_PATH, '%d' % SIZE))
		rmtree(tempdir)
		remove(filename)
		print('Done !')
	else:
		print('Bad Content-Type: %s' % 'application/zip')
	return 0
if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))