Import('env', 'projenv')

import os
import gzip
import shutil

try:
    import minify_html
except ImportError:
    env.Execute("$PYTHONEXE -m pip install minify-html")

try:
    from jsmin import jsmin
except ImportError:
    env.Execute("$PYTHONEXE -m pip install jsmin")

data_dir = env.get('PROJECT_DATA_DIR')
data_src_dir = os.path.join(env.get('PROJECT_DIR'), 'data_src')


def gzip_file(src, dst, delete_source = False):
    with open(src, 'rb') as f_in, gzip.open(dst + '.gz', 'wb') as f_out:
        f_out.writelines(f_in)
    if delete_source:
        os.remove(src)


def minify_file(filename):
    file_src = os.path.join(data_src_dir, filename)
    file_dst = os.path.join(data_dir, filename)
    with open(file_src , 'r', encoding="utf-8") as f_in:
        if filename.split(".")[-1] == "html":
            minified = minify_html.minify(f_in.read(), minify_js=True, do_not_minify_doctype=True, keep_html_and_head_opening_tags=True, minify_css=True, remove_processing_instructions=True)
        elif filename.split(".")[-1] == "js":
            minified = jsmin(f_in.read())
    with open(file_dst, "w", encoding="utf-8") as f_out:
        f_out.write(minified)
    gzip_file(file_dst, file_dst, True)


def minify_data(source, target, env):
    if(os.path.exists(data_dir) and not os.path.exists(data_src_dir) ):
        print('  "data" dir exists, "data_src" not found.')
        print('  renaming "' + data_dir + '" to "' + data_src_dir + '"')
        os.rename(data_dir, data_src_dir)

    if(os.path.exists(data_dir)):
        print('  Deleting data dir ' + data_dir)
        shutil.rmtree(data_dir)

    print('  Re-creating empty data dir ' + data_dir)
    os.mkdir(data_dir)

    minify_file('index.html')
    minify_file('main.js')
    gzip_file(os.path.join(data_src_dir, 'favicon.ico'), os.path.join(data_dir, 'favicon.ico'))

env.AddPreAction('$BUILD_DIR/littlefs.bin', minify_data)