import file_utils
import package_utils
import package_web_record
import package_web_shanshen
import os.path
import sys
import json
import importlib

sdkMapping = {
    'ysdk':'jm_ysdk',
    'ziyun': {
        'default': 'jm_zy',
        'ysdk': 'jm_zy_ysdk',
    },
    'xunqu':{
        'default':'jm_xq',
        'xiaomi':'jm_xq_mi',
        'jrtt':'jm_xq_jrtt'
    },
    'jingqi':'jm_jq',
    'qytx':{
        'default':'jm_qytx',
        'cangyu':'jm_qytx2',
        'cangyu_new':'jm_cangyu'
    },
    'jmsdk':'jm',
    'oppo':'jm_oppo',
    'quick':'jm_quick',
    'beiyu':'jm_beiyu',
    'yijie':'jm_yijie',
    'gzjysdk':'gzjysdk',
    'record':'record',
    'float':'float'
}

scriptMapping = {
    'jm_xq_mi':'jm_xq',
    'jm_xq_jrtt':'jm_xq',
    'jm_qytx2':'jm_qytx',
    'jm_cangyu':'jm_qytx'
}

newSdk = ["shanshen", "gzjysdk"]
recordSdk = ["record", "float"]

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('************************************')

    sdk = getMappingSdk(config)
    if sdk in recordSdk:
        package_web_record.package(config, sdk)
    elif sdk in newSdk:
        package_web_shanshen.package(config, sdk)
    else:
        package(config, sdk)

def package(config, sdk):
    print('use script 1st')
    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']

    jsonConfig['logSdk'] = ['jrtt', 'gdt']

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

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

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

    # 打包
    package_utils.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
    print('sdk_script -- > %s' % targetScript)
    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, 'common_sdk_icon.png')
            file_utils.copyFile(config['icon'], iconPath)

    '''if 'switchIcon' in config and os.path.exists(config['switchIcon']):
        mipmapSupport = ['mipmap-xhdpi', 'mipmap-xxhdpi', 'mipmap-xxxhdpi']
        for mipmap in mipmapSupport:
            iconPath = os.path.join(subChannelPath, 'icon', mipmap, 'common_sdk_icon2.png')
            file_utils.copyFile(config['switchIcon'], iconPath)'''

    if 'splash' in config and os.path.exists(config['splash']):
        splashPath = os.path.join(subChannelPath, 'splash', 'drawable-hdpi', 'common_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):
    sdk = config['sdk']
    mapping = sdk
    if sdk in sdkMapping:
        mapping = sdkMapping[sdk]
    else:
        return 'jm_' + sdk

    if type(mapping) == dict:
        sdkConfig = config[sdk]
        if 'SUB_CHANNEL' in sdkConfig and sdkConfig['SUB_CHANNEL'] != '':
            subChannel = sdkConfig['SUB_CHANNEL']
        else:
            subChannel = 'default'
        return mapping[subChannel]
    else:
        return mapping

def getScriptMapping(sdk):
    if sdk in scriptMapping:
        return scriptMapping[sdk]
    return sdk

packageWeb()