"""Contact sheet: how the icon actually looks at taskbar / tray / explorer sizes."""
import struct
import zlib
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from make_icon import render, png_bytes

SIZES = [16, 20, 24, 32, 40, 48, 64, 128, 256]
SCALE = {16: 8, 20: 8, 24: 6, 32: 6, 40: 5, 48: 4, 64: 3, 128: 2, 256: 1}
PAD = 10
BG_DARK = (30, 30, 32)
BG_LIGHT = (240, 242, 245)


def over(rgba, size, bg):
    out = bytearray(size * size * 4)
    for i in range(size * size):
        a = rgba[i * 4 + 3] / 255.0
        for k in range(3):
            v = rgba[i * 4 + k] * a + bg[k] * (1.0 - a)
            out[i * 4 + k] = int(v + 0.5)
        out[i * 4 + 3] = 255
    return bytes(out)


def main():
    tiles = [(s, over(render(s), s, (0, 0, 0))) for s in SIZES]
    tw = sum(SIZES[i] * SCALE[SIZES[i]] + 2 * PAD for i in range(len(SIZES)))
    th = max(SIZES[i] * SCALE[SIZES[i]] for i in range(len(SIZES))) + 2 * PAD
    H = th * 2 + 2 * PAD

    buf = bytearray(b'\x00' * (tw * 4 * H))

    def put_bg(y0, y1, bg):
        for y in range(y0, y1):
            row = y * tw * 4
            for x in range(tw):
                i = row + x * 4
                buf[i] = bg[0]; buf[i + 1] = bg[1]; buf[i + 2] = bg[2]; buf[i + 3] = 255

    put_bg(0, th + PAD, BG_DARK)
    put_bg(th + PAD, H, BG_LIGHT)

    for band, (y0, bg) in enumerate([(PAD, BG_DARK), (th + PAD, BG_LIGHT)]):
        x = PAD
        for size, _ in tiles:
            sc = SCALE[size]
            px = over(render(size), size, bg)
            for sy in range(size * sc):
                yy = y0 + sy
                row = yy * tw * 4
                for sx in range(size * sc):
                    s = sx // sc
                    t = sy // sc
                    si = (t * size + s) * 4
                    i = row + (x + sx) * 4
                    buf[i] = px[si]; buf[i + 1] = px[si + 1]
                    buf[i + 2] = px[si + 2]; buf[i + 3] = 255
            x += size * sc + 2 * PAD

    with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'app_icon_sizes.png'), 'wb') as f:
        f.write(png_bytes(tw, H, bytes(buf)))
    print('wrote app_icon_sizes.png  %dx%d' % (tw, H))


if __name__ == '__main__':
    main()
