#!/usr/bin/env python3

import assetmgr
import json
import os
import re
import sys

def main():
    fd = open(sys.argv[1], 'r')
    data = fd.read()
    fd.close()

    basename = os.path.basename(sys.argv[1]).replace('.json', '')
    shortname = get_shortname(basename)

    rows = json.loads(data)

    if os.environ['ROMID'].startswith('ntsc') and basename.endswith('E'):
        make_header(rows, shortname)
    elif os.environ['ROMID'].startswith('pal') and basename.endswith('P'):
        make_header(rows, shortname)
    elif os.environ['ROMID'].startswith('jpn') and basename.endswith('J'):
        make_header(rows, shortname)

    make_object(rows, basename)

def get_shortname(basename):
    return re.match(r'^[a-z0-9]+', basename)[0]

def make_header(rows, shortname):
    typename = 'l_%s' % shortname
    enums = [row['id'] for row in rows]
    filename = 'lang/%s.h' % shortname
    terminator = 'L_%s_END' % shortname.upper()
    start = banks.index(shortname) * 512
    assetmgr.write_enums(typename, enums, filename, terminator, start=start)

def make_object(rows, basename):
    binary = make_binary(rows)
    zipped = assetmgr.zip(binary)

    # Write the zipped file, purely so `make test` can verify it
    if '_str_' in basename:
        tmpfilename = basename + 'Z'
    else:
        tmpfilename = basename

    assetmgr.writefile('build/%s/assets/files/L%s' % (os.environ['ROMID'], tmpfilename), zipped)

    filename = 'files/L%s.o' % basename
    assetmgr.write_object(zipped, filename)

def make_binary(rows):
    if len(rows) == 0:
        return (0).to_bytes(16, 'big')

    output = bytes()
    pos = len(rows) * 4

    for index, row in enumerate(rows):
        if row['text'] is None:
            output += (0).to_bytes(4, 'big')
        else:
            output += pos.to_bytes(4, 'big')
            pos += assetmgr.align4(len(row['text']) + 1)

    for index, row in enumerate(rows):
        if row['text'] is not None:
            output += row['text'].encode('latin_1')
            amount = 4 - (len(row['text']) % 4)
            output += (0).to_bytes(amount, 'big')

    if len(output) % 16:
        amount = 16 - (len(output) % 16)
        output += (0).to_bytes(amount, 'big')

    return output

banks = [
    '',
    'ame',
    'arch',
    'ark',
    'ash',
    'azt',
    'cat',
    'cave',
    'arec',
    'crad',
    'cryp',
    'dam',
    'depo',
    'dest',
    'dish',
    'ear',
    'eld',
    'imp',
    'jun',
    'lee',
    'len',
    'lip',
    'lue',
    'oat',
    'pam',
    'pete',
    'ref',
    'rit',
    'run',
    'sevb',
    'sev',
    'sevx',
    'sevxb',
    'sho',
    'silo',
    'stat',
    'tra',
    'wax',
    'gun',
    'title',
    'mpmenu',
    'propobj',
    'mpweapons',
    'options',
    'misc',
    'uff',
    'old',
    'ate',
    'lam',
    'mp1',
    'mp2',
    'mp3',
    'mp4',
    'mp5',
    'mp6',
    'mp7',
    'mp8',
    'mp9',
    'mp10',
    'mp11',
    'mp12',
    'mp13',
    'mp14',
    'mp15',
    'mp16',
    'mp17',
    'mp18',
    'mp19',
    'mp20',
]

main()
