#!/usr/bin/env python
#
# Takes a directory of files and zips them up (as uncompressed files).
# This then gets converted into a C data structure which can be read
# like a filesystem at runtime.
#
# This is somewhat like frozen modules in python, but allows arbitrary files
# to be used.

from __future__ import print_function

import argparse
import os
import subprocess
import sys
import types


def create_zip(zip_filename, zip_dir):
    abs_zip_filename = os.path.abspath(zip_filename)
    save_cwd = os.getcwd()
    os.chdir(zip_dir)
    if os.path.exists(abs_zip_filename):
        os.remove(abs_zip_filename)
    subprocess.check_call(["zip", "-0", "-r", "-D", abs_zip_filename, "."])
    os.chdir(save_cwd)


def create_c_from_file(c_filename, zip_filename):
    with open(zip_filename, "rb") as zip_file:
        with open(c_filename, "wb") as c_file:
            print("#include <stdint.h>", file=c_file)
            print("", file=c_file)
            print("const uint8_t memzip_data[] = {", file=c_file)
            while True:
                buf = zip_file.read(16)
                if not buf:
                    break
                print("   ", end="", file=c_file)
                for byte in buf:
                    if isinstance(byte, types.StringType):
                        print(" 0x{:02x},".format(ord(byte)), end="", file=c_file)
                    else:
                        print(" 0x{:02x},".format(byte), end="", file=c_file)
                print("", file=c_file)
            print("};", file=c_file)


def main():
    parser = argparse.ArgumentParser(
        prog="make-memzip.py",
        usage="%(prog)s [options] [command]",
        description="Generates a C source memzip file.",
    )
    parser.add_argument(
        "-z",
        "--zip-file",
        dest="zip_filename",
        help="Specifies the name of the created zip file.",
        default="memzip_files.zip",
    )
    parser.add_argument(
        "-c",
        "--c-file",
        dest="c_filename",
        help="Specifies the name of the created C source file.",
        default="memzip_files.c",
    )
    parser.add_argument(dest="source_dir", default="memzip_files")
    args = parser.parse_args(sys.argv[1:])

    print("args.zip_filename =", args.zip_filename)
    print("args.c_filename =", args.c_filename)
    print("args.source_dir =", args.source_dir)

    create_zip(args.zip_filename, args.source_dir)
    create_c_from_file(args.c_filename, args.zip_filename)


if __name__ == "__main__":
    main()
