#!/usr/bin/env python3

# This file is a modified version of the gen_embedded script included in the
# scripts directory of seasocks (version 1.1.2). It has been modified to
# recursively find the web files itself, which was originally done by piping
# in the results from a "find" shell command.

# The embedded files includes only those that are required for the server to run
# (including 404 files, a default index page, favicon, etc.)

import os, os.path, sys

output = sys.argv[1].replace('"', '')

if not os.path.exists(os.path.dirname(output)):
  os.makedirs(os.path.dirname(output))

if len(sys.argv) >= 3:
  web = sys.argv[2:]
else:
  web = []
  for root, dirs, files in os.walk("./www_defaults", topdown=False):
    for name in files + dirs:
      web.append(os.path.join(root, name))

with open(output, 'w') as o:
  o.write("""
#include "internal/Embedded.h"

#include <string>
#include <unordered_map>

namespace {

std::unordered_map<std::string, EmbeddedContent> embedded = {
""")

  for f in web:
    with open(f, 'rb') as file:
      bytes = file.read()
    o.write('{"/%s", {' % os.path.basename(f))
    o.write('"' + "".join(['\\x%02x' % x for x in bytes]) + '"')
    o.write(',%d }},' % len(bytes))

  o.write("""
};

} // namespace

const EmbeddedContent* findEmbeddedContent(const std::string& name) {
  auto found = embedded.find(name);
  if (found == embedded.end()) {
    return NULL;
  }
  return &found->second;
}
""")
