# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import os
import logging

LOGTAG = '[CosUpload]'

#测试shell
# python3 CosUpload.py dev android inpkg_src 4849

# 调试模式，打印更多日志
DEBUG = False

# 测试模式从本地上传到cos，正式模式从jenkins上传到cos
TEST = False

# 使用临时密钥需要传入 Token，默认为空，可不填
token = None

# 指定使用 http/https 协议来访问 COS，默认为 https，可不填
scheme = 'https'

src_reversion = '4849'
res_reversion = '4830'
boot_reversion = '4815'

# modules里的资源类型
moudlesType = ['inpkg_src', 'inpkg_res', 'inpkg_boot']

fromFloders = []
toFloders = []

# 正常情况日志级别使用 WARNING，需要定位时可以修改为 INFO，此时 SDK 会打印和服务端的通信信息
def setLogLevel():
    if DEBUG:
        logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    else:
        logging.getLogger('qcloud_cos').setLevel(logging.WARNING)

# buildEnv: dev:开发环境 production:正式环境
# platform: android ios
def initBaseFloders(buildEnv, platform):
    global modules_from_floder_base, sublists_from_floder, versions_from_floder, modules_to_floder_base, sublists_to_floder, versions_to_floder
    if TEST:
        # from floders
        modules_from_floder_base = '/Users/zhangpeng/xgame/client/xClient/Project/tools/uploadToCos/hot_update_files/android/modules/'
        sublists_from_floder = '/Users/zhangpeng/xgame/client/xClient/Project/tools/uploadToCos/hot_update_files/android/sublists/'
        versions_from_floder = '/Users/zhangpeng/xgame/client/xClient/Project/tools/uploadToCos/hot_update_files/android/versions/'

        modules_to_floder_base = 'updatefiles/test/hot_update_files/android/modules/'
        sublists_to_floder = 'updatefiles/test/hot_update_files/android/sublists/'
        versions_to_floder = 'updatefiles/test/hot_update_files/android/versions/'
    else:
        # from floders
        modules_from_floder_base = '/home/ubuntu/updatefiles/' + buildEnv + '/' + platform + '/modules/'
        sublists_from_floder = '/home/ubuntu/updatefiles/' + buildEnv + '/' + platform + '/sublists/'
        versions_from_floder = '/home/ubuntu/updatefiles/' + buildEnv + '/' + platform + '/versions/'

        # to floderss
        modules_to_floder_base = 'updatefiles/' + buildEnv + '/' + platform + '/modules/'
        sublists_to_floder = 'updatefiles/' + buildEnv + '/' + platform + '/sublists/'
        versions_to_floder = 'updatefiles/' + buildEnv + '/' + platform + '/versions/'

    print(LOGTAG, f'初始化文件夹: [modules_to_floder_base: {modules_to_floder_base}] [sublists_to_floder: {sublists_to_floder}] [versions_to_floder: {versions_to_floder}]\n')

# 设置用户属性
def initCosUserCfg():
    global _secretId, _secretKey, _region, _appId, _bucket, config,client
    _secretId = 'AKIDnRr1vZy70f55qKYWFivsZ0Ti1A3gCTUV'
    _secretKey = '0lGWXJxRgfVDhy0mIsKWTMBsuiGZdR1M'
    _region = 'na-siliconvalley'
    _appId = '1304062922'
    _bucket = f"package-{_appId}"
    config = CosConfig(Region=_region, SecretId=_secretId, SecretKey=_secretKey, Token=token, Scheme=scheme)
    client = CosS3Client(config)
    print(LOGTAG,f'初始化cos配置成功, bucket: {_bucket}\n')


# 上传文件
def uploadFile(localFilePath, key):
    response = client.upload_file(
        Bucket=_bucket,
        LocalFilePath=localFilePath,
        Key=key,
        PartSize=1,
        MAXThread=10,
        EnableMD5=False
    )
    # print(response['ETag'])


# 把一个文件夹内的内容递归上传到另一个文件夹
def uploadFolderFromTo(fromFloder, toFolder):
    for root, dirs, files in os.walk(fromFloder):
        for name in files:
            localFilePath = os.path.join(root, name)
            key = os.path.relpath(localFilePath, fromFloder)
            key = os.path.join(toFolder, key)
            # print(LOGTAG,'上传文件到:', key)
            uploadFile(localFilePath, key)
            print(LOGTAG,f'upload:::{localFilePath} -> {key} success')

# 1.上传inpkg_xxx内的moudles目录到cos(res资源比较大，需要过滤一下资源类型和svn版本号)
def uploadModuletoCos(abType, reversion):
    print(LOGTAG,f'1. modules 上传资源类型: {abType}, 版本号: {reversion}')
    for t in moudlesType:
        if t == abType:
            modules_from_floder = os.path.join(modules_from_floder_base, t, reversion)
            modules_to_floder = os.path.join(modules_to_floder_base, t, reversion)
            print(LOGTAG,f"{modules_from_floder} => {modules_to_floder}")
            uploadFolderFromTo(modules_from_floder, modules_to_floder)
    print('\n')

# 2.上传sublists文件夹到cos
def uploadSublistsToCos():
    print(LOGTAG,f'2. sublists 上传')
    uploadFolderFromTo(sublists_from_floder, sublists_to_floder)
    print(LOGTAG,'sublists 上传成功\n')

# 3.上传versions文件夹到cos
def uploadVersionsToCos():
    print(LOGTAG,f'3. versions 上传')
    uploadFolderFromTo(versions_from_floder, versions_to_floder)
    print(LOGTAG,'versions 上传成功\n')


def main():
    if TEST:
        print(LOGTAG,'测试模式')
        _buildEnv = 'dev'
        _platform = 'android'
        _abType = 'inpkg_src'
        _reversion = '4849'
    else:
        _buildEnv = sys.argv[1]
        _platform = sys.argv[2]
        _abType = sys.argv[3]
        _reversion = sys.argv[4]
    
    setLogLevel()
    initCosUserCfg()
    initBaseFloders(_buildEnv, _platform)
    uploadModuletoCos(_abType, _reversion)
    uploadSublistsToCos()
    uploadVersionsToCos()
if __name__ == '__main__':
    main()