#!/usr/bin/env python3

import os
import logging
import argparse
import json
import platform
import tempfile
from urllib.parse import quote_plus as urllib_quote_plus

import devkit_utils

logging.basicConfig(format='%(message)s', level=logging.DEBUG)
logger = logging.getLogger()

DEVKIT_TOOL_FOLDER = os.path.expanduser('~/devkit-game')

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', required=False, action='store_true')
    parser.add_argument('--parms', required=True, action='store')
    conf = parser.parse_args()

    if conf.verbose:
        logger.setLevel(logging.DEBUG)
    else:
        logger.setLevel(logging.INFO)

    parms = json.loads(conf.parms)
    gameid = parms['gameid']
    directory = parms['directory']
    assert os.path.isdir(directory)

    force_appid = parms['force_appid']
    steam_appid_path = os.path.join(directory, 'steam_appid.txt')
    if force_appid:
        with open(steam_appid_path, 'w') as f:
            f.write(force_appid + '\n')
        logger.info(f'Wrote {steam_appid_path} with AppID {force_appid}')
    elif os.path.exists(steam_appid_path):
        # don't overwrite an existing steam_appid.txt file from the content tree
        # NOTE: if the user sets an AppID through the tool, then delete it, we may leave it in place ..
        # (that's ok for now, do a clean upload if you want to get rid of it)
        logger.info(f'{steam_appid_path} already exists, leaving it in place')

    # Lepton (Android runtime) titles: write UECommandLine.txt next to the .apk
    is_lepton = parms['settings']['compat_tool'] == 'lepton'
    uecommandline = parms['lepton_args'] if is_lepton else ''
    uecommandline_path = os.path.join(directory, 'UECommandLine.txt')
    if uecommandline:
        with open(uecommandline_path, 'w') as f:
            f.write(uecommandline + '\n')
        logger.info(f'Wrote {uecommandline_path}')
    elif os.path.exists(uecommandline_path):
        # don't overwrite an existing UECommandLine.txt file from the content tree
        # NOTE: if the user sets cmdline args through the tool, then clears them, we may leave it in place ..
        # (that's ok for now, do a clean upload if you want to get rid of it)
        logger.info(f'{uecommandline_path} already exists, leaving it in place')

    logger.info(f'Updating command line and runtime settings for {gameid} on {platform.node()}')
    devkit_utils.save_argv(gameid, parms['argv'])
    devkit_utils.save_env(gameid, parms['env'])
    devkit_utils.save_settings(gameid, parms)

    ret = {}

    try:
        devkit_utils.validate_steam_client()
    except devkit_utils.SteamClientNotRunningException as e:
        skipping = 'The Steam client is not running. Registration did not complete.'
        logger.warning(skipping)
        ret['error'] = skipping
    else:
        with tempfile.TemporaryDirectory(prefix='create-shortcut') as tempdir:
            logger.info(f'Registering Devkit Game {gameid} with Steam Client')
            response = os.path.join(tempdir, 'registered')
            cmd = 'create-shortcut?response={}&gameid={}'.format(
                urllib_quote_plus(response),
                gameid,
            )
            devkit_utils.execute_steam_client_command(cmd)
            try:
                with devkit_utils.wait_on_file_response(response) as success_response:
                    logger.debug(success_response)
                    ret['success'] = success_response
            except devkit_utils.SteamResponse_Timeout:
                ret['error'] = 'timeout - Steam client did not respond to registration request'
            except devkit_utils.SteamResponse_Error as e:
                ret['error'] = e.error_response

    # response gets written out to stdout
    print(json.dumps(ret))
