import file_utils
import package_utils_shanshen
import os.path
import sys
import json
import importlib

def packageWeb():
    if len(sys.argv) < 2:
        print('argument is missing')
        return 1

    # 打包配置的路径
    packageConfig = sys.argv[1]

    jsonText = file_utils.readFile(packageConfig)
    config = json.loads(jsonText)

    print('*************config*****************')
    print(jsonText)
    print('************************************')

    package(config, config['sdk'])

def package(config, sdk):
    print('use script 2nd')
    jsonConfig = {}
    game = config['app']
    subChannel = None

    if 'subChannel' in config:
        subChannel = config['subChannel']
        jsonConfig['subChannel'] = config['subChannel']

    # 必须参数
    jsonConfig['packageName'] = config['packageName']
    jsonConfig['name'] = config['name']

    # 可选参数
    if 'outName' in config:
        jsonConfig['outName'] = config['outName']

    if 'outPath' in config:
        jsonConfig['outPath'] = config['outPath']

    if 'changeIcon' in config:
        jsonConfig['changeIcon'] = toBoolean(config['changeIcon'])

    if 'addLauncher' in config:
        jsonConfig['addLauncher'] = toBoolean(config['addLauncher'])

    if 'versionCode' in config:
        jsonConfig['versionCode'] = config['versionCode']

    if 'versionName' in config:
        jsonConfig['versionName'] = config['versionName']

    if 'targetSdkVersion' in config:
        jsonConfig['targetSdkVersion'] = config['targetSdkVersion']
        
    if 'v2disable' in config:
        jsonConfig['v2disable'] = toBoolean(config['v2disable'])

    if 'aapt2disable' in config:
        jsonConfig['aapt2disable'] = toBoolean(config['aapt2disable'])

    # sdk相关参数
    if 'properties' in config:
        jsonConfig['properties'] = config['properties']

    # 获取sdk相关配置
    getSdkConfig(sdk, jsonConfig, config)

    # 生成配置文件
    createOrUpdateConfigFile(game, sdk, jsonConfig)

    # 拷贝资源
    copyRes(game, sdk, subChannel, config)

    # 打包
    package_utils_shanshen.packConsole(game, sdk, subChannel)

def toBoolean(booleanStr):
    if type(booleanStr) == bool:
        return booleanStr

    if booleanStr == 'true':
        return True
    return False

def getSdkConfig(sdk, jsonConfig, config):
    scriptPath = os.path.join(file_utils.getCurrentPath(), 'sdk_script')
    sdkScript = getScriptMapping(sdk)
    targetScript = os.path.join(scriptPath, '%s.py' % sdkScript)
    if not os.path.exists(targetScript):
        print('%s no exists' % targetScript)
        return 0

    sys.path.append(scriptPath)
    module = importlib.import_module(sdkScript)# 动态导入相应模块
    module.getSdkConfig(jsonConfig, config)# 执行脚本功能
    sys.path.remove(scriptPath)

def createOrUpdateConfigFile(game, sdk, jsonConfig):
    '''
    更新配置文件
    '''
    if 'subChannel' not in jsonConfig:
        return 0

    print('createOrUpdateConfigFile ...')

    channelPath = file_utils.getChannelPath(game, sdk)
    configPath = os.path.join(channelPath, 'config.json')
    #configPath = os.path.join(file_utils.getCurrentPath(), 'test', 'test.json')

    if os.path.exists(configPath):
        # 更新数据
        jsonText = file_utils.readFile(configPath)
        config = json.loads(jsonText)

        count = 0
        if type(config) == list:
            for item in config:
                if item['subChannel'] == jsonConfig['subChannel']:
                    print('find same config ...')
                    del config[count]
                    break

                count += 1

            config.append(jsonConfig)

            createConfigFile(config, configPath)
        elif type(config) == dict:
            if config['subChannel'] == jsonConfig['subChannel']:
                print('find same config ...')
                createConfigFile(jsonConfig, configPath)
            else:
                print('add a new config ...')
                config = [config, jsonConfig]

                createConfigFile(config, configPath)
    else:
        print('create a new config ...')
        createConfigFile([jsonConfig], configPath)

def createConfigFile(jsonConfig, configPath):
    '''
    创建配置文件
    '''
    jsonStr = json.dumps(jsonConfig, ensure_ascii=False)
    print('*************out config*************')
    print(jsonStr)
    print('************************************')
    file_utils.createFile(configPath, jsonStr)

def copyRes(game, sdk, subChannel, config):
    '''
    拷贝资源
    '''
    if subChannel is None:
        return 0

    channelPath = file_utils.getChannelPath(game, sdk)
    subChannelPath = os.path.join(channelPath, subChannel)
    if 'icon' in config and os.path.exists(config['icon']):
        mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
        for mipmap in mipmapSupport:
            iconPath = os.path.join(subChannelPath, 'icon', mipmap, 'shanshen_sdk_icon.png')
            file_utils.copyFile(config['icon'], iconPath)

    if 'splash' in config and os.path.exists(config['splash']):
        splashPath = os.path.join(subChannelPath, 'splash', 'drawable-hdpi', 'shanshen_sdk_launcher_bg.jpg')
        file_utils.copyFile(config['splash'], splashPath)

    if 'copyList' in config:
        for item in config['copyList']:
            if item['toFile'] == '':
                continue

            if not os.path.exists(item['fromFile']):
                continue

            toFile = item['toFile']
            if toFile[:3] == 'res':
                toFile = 'image' + toFile[3:]
                
            resPath = getPackagePath(subChannelPath, toFile)
            file_utils.copyFile(item['fromFile'], resPath)

    if 'package' in config and os.path.exists(config['package']):
        newGameApk = config['package']
        gameApk = file_utils.getFullGameApk(game)
        file_utils.copyFile(newGameApk, gameApk)

def getPackagePath(basePath, packageName):
    '''
    包名对应的目录
    '''
    packageNameSplit = packageName.replace('\\', '/').split('/')
    newPath = basePath
    for item in packageNameSplit:
        newPath = os.path.join(newPath, item)
    return newPath

def getMappingSdk(config):
    return config['sdk']

def getScriptMapping(sdk):
    return sdk

#packageWeb()