import os
import lzma

#
# decode_file
#
def decode_file(path):
    basename = os.path.splitext(path)[0]
    decodedname = basename + ".decoded.csv"

    print("process:", path, "->", decodedname)

    with open(path, 'rb') as f:
        data = f.read()

    tempdata = bytearray()

    for i in range(0, 8):
        tempdata.append(data[i])

    for i in range(0, 4):
        tempdata.append(0)

    for i in range(8, len(data)):
        tempdata.append(data[i])

    try:
        with open(decodedname, 'wb') as f:
            decompressor = lzma.LZMADecompressor()
            unpack_data = decompressor.decompress(tempdata)
            f.write(unpack_data)
    except:
        print("invalid input:", path)

#
# decode_file
#
def len_2_bytes(datalen, max_len=4):
    data = []
    while datalen > 0:
        item = datalen % 256
        datalen = int(datalen / 256)
        data.append(item)
    while len(data) < max_len:
        data.append(0)
    return data

def encode_file(path, max_len=4):
    basename = os.path.splitext(path)[0]
    encodedname = basename + ".encoded.csv"

    print("process:", path, "->", encodedname)

    with open(path, 'rb') as f:
        data = f.read()

    filters = [
        {
            "id": lzma.FILTER_LZMA1,
            "dict_size": 256 * 1024,
            "lc": 3,
            "lp": 0,
            "pb": 2,
            "mode": lzma.MODE_NORMAL
        },
    ]

    pack_data = lzma.compress(data, format=lzma.FORMAT_ALONE, filters=filters)

    lzmadata = bytearray()

    for i in range(0, 5):
        lzmadata.append(pack_data[i])

    data_size = len_2_bytes(len(data), max_len)
    for size in data_size:
        lzmadata.append(size)

    for i in range(13, len(pack_data)):
        lzmadata.append(pack_data[i])

    #for i in range(0, len(lzmadata)):
    #    print("i: ", i, " val: ", lzmadata[i])

    with open(encodedname, 'wb') as f:
        f.write(lzmadata)

#
# restore_file
#
def restore_file(path):
    with open(path, 'rb') as f:
        data = f.read()

    tempdata = bytearray()

    for i in range(0, 8):
        tempdata.append(data[i])

    for i in range(0, 4):
        tempdata.append(0)

    for i in range(8, len(data)):
        tempdata.append(data[i])

    with open('real.lzma', 'wb') as f:
        f.write(tempdata)