#!/usr/bin/env python3
"""Minimal HTTP server for the IWA dev-mode proxy origin.

Serves the contents of ./app on http://127.0.0.1:8123.
Generates /icon.png (256x256 solid green) on the fly so the artifacts
directory contains no binary files.
"""
import http.server
import os
import struct
import sys
import threading
import zlib

HOST = '127.0.0.1'
PORT = 8123
ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'app')


def make_png(w: int, h: int) -> bytes:
    """Return a minimal solid-green RGB PNG of the given size."""
    def chunk(tag: bytes, data: bytes) -> bytes:
        return (struct.pack('>I', len(data)) + tag + data +
                struct.pack('>I', zlib.crc32(tag + data) & 0xffffffff))

    sig = b'\x89PNG\r\n\x1a\n'
    ihdr = chunk(b'IHDR', struct.pack('>IIBBBBB', w, h, 8, 2, 0, 0, 0))
    raw = b''.join(b'\x00' + (b'\x00\xff\x00' * w) for _ in range(h))
    idat = chunk(b'IDAT', zlib.compress(raw, 9))
    iend = chunk(b'IEND', b'')
    return sig + ihdr + idat + iend


ICON_PNG = make_png(256, 256)


class Handler(http.server.SimpleHTTPRequestHandler):
    extensions_map = dict(http.server.SimpleHTTPRequestHandler.extensions_map)
    extensions_map.update({
        '.webmanifest': 'application/manifest+json',
        '.js': 'application/javascript',
        '.html': 'text/html; charset=utf-8',
    })

    def __init__(self, *a, **kw):
        super().__init__(*a, directory=ROOT, **kw)

    def do_GET(self):
        if self.path.split('?', 1)[0] == '/icon.png':
            self.send_response(200)
            self.send_header('Content-Type', 'image/png')
            self.send_header('Content-Length', str(len(ICON_PNG)))
            self.end_headers()
            self.wfile.write(ICON_PNG)
            return
        super().do_GET()

    def log_message(self, fmt, *args):
        sys.stderr.write('[server] %s\n' % (fmt % args))


def start_background():
    httpd = http.server.ThreadingHTTPServer((HOST, PORT), Handler)
    t = threading.Thread(target=httpd.serve_forever, daemon=True)
    t.start()
    return httpd


if __name__ == '__main__':
    print(f'Serving {ROOT} on http://{HOST}:{PORT}')
    http.server.ThreadingHTTPServer((HOST, PORT), Handler).serve_forever()
