import vdf
import sys
import os
import json


STAT_TYPE_INT = '1'
STAT_TYPE_FLOAT = '2'
STAT_TYPE_AVGRATE = '3'
STAT_TYPE_BITS = '4'

def generate_stats_achievements(schema, config_directory):
    schema = vdf.binary_loads(schema)
    # print(schema)
    achievements_out = []
    stats_out = []

    for appid in schema:
        sch = schema[appid]
        stat_info = sch['stats']
        for s in stat_info:
            stat = stat_info[s]
            if stat['type'] == STAT_TYPE_BITS:
                achs = stat['bits']
                for ach_num in achs:
                    out = {}
                    ach = achs[ach_num]
                    out["hidden"] = '0'
                    for x in ach['display']:
                        value = ach['display'][x]
                        if x == 'name':
                            x = 'displayName'
                        if x == 'desc':
                            x = 'description'
                        if x == 'Hidden':
                            x = 'hidden'
                        out[x] = value
                    out['name'] = ach['name']
                    if 'progress' in ach:
                        out['progress'] = ach['progress']
                    achievements_out += [out]
            else:
                out = {}
                out['default'] = 0
                out['name'] = stat['name']
                if stat['type'] == STAT_TYPE_INT:
                    out['type'] = 'int'
                elif stat['type'] == STAT_TYPE_FLOAT:
                    out['type'] = 'float'
                elif stat['type'] == STAT_TYPE_AVGRATE:
                    out['type'] = 'avgrate'
                if 'Default' in stat:
                    out['default'] = stat['Default']
                elif 'default' in stat:
                    out['default'] = stat['default']

                stats_out += [out]
            #print(stat_info[s])



    output_ach = json.dumps(achievements_out, indent=4)
    output_stats = ""
    for s in stats_out:
        default_num = 0
        if (s['type'] == 'int'):
            try:
                default_num = int(s['default'])
            except ValueError:
                default_num = int(float(s['default']))
        else:
            default_num = float(s['default'])
        output_stats += "{}={}={}\n".format(s['name'], s['type'], default_num)

    # print(output_ach)
    # print(output_stats)

    if not os.path.exists(config_directory):
        os.makedirs(config_directory)

    with open(os.path.join(config_directory, "achievements.json"), 'w') as f:
        f.write(output_ach)

    with open(os.path.join(config_directory, "stats.txt"), 'w', encoding='utf-8') as f:
        f.write(output_stats)

    return (achievements_out, stats_out)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("format: {} UserGameStatsSchema_480.bin".format(sys.argv[0]))
        exit(0)


    with open(sys.argv[1], 'rb') as f:
        schema = f.read()

    generate_stats_achievements(schema, os.path.join("{}".format( "{}_output".format(sys.argv[1])), "steam_settings"))