#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from libs.inc import CliTool
from conf.app_const import *
import sys, os
idc = sys.argv[1]
app = sys.argv[2]
isIntra = (sys.argv[3] == 'intra')
pubEnv = sys.argv[4]

#编译node参数: npmbd/npm 触发编译，其他值只发布已有的dist目录
npmCmd = sys.argv[5]
mode = sys.argv[6]

timeout = '120'

if isIntra is True:
    localPwdFile = '/home/porsche/publish/tjds1.passwd'
else:
    localPwdFile = '/Users/tangjianhui/Documents/publish/tjds1.passwd'

def getDictKeyByValue(app, distMap):
    for realRepo, apps in distMap.items():
        if app in apps:
           return realRepo
        
    return False


if isIntra is True:
    localSrc = '/alidata/www/' + app + '/'
else:
    ##根据app或者真实的地址
    repo =  get_app_repo_map(app)
    localSrc = CliTool.workspace() + repo + '.git/'
    if os.path.isdir(localSrc) is False:
        print('目录 {}.git 未找到， 非有效的程序目录'.format(repo))
        exit()

##只有 npmbd 或 npm 才编译，否则只发布已有的 dist 目录
buildWeb = npmCmd in ['npmbd', 'npm']
##web发布只发布前端，不发布api
onlyPubWeb = True

if buildWeb is True:
    feGitDir = {
        APP_TMS_MOBILE: 'mobile',
        APP_TMS_APP: 'tms-applet',
    }.get(app, 'web')
    
    baseCmd = 'export NODE_OPTIONS="--max-old-space-size=8192"; cd ' + localSrc + feGitDir

    buildCmd = get_yarn_build_cmd(app)
    print(buildCmd)
    ##零时兼容默认build命令，之前全部废除
    if buildCmd is False:
        print("app {}编译命令为False,请检查".format(app))
        exit()


    for tag in ['dz', 'ry', 'tbk', 'digshow', 'desktop', 'gold', 'greatboss', 'easyboss']:
        if app in [APP_EARTH_DESKTOP_CS]:
            continue
         
        if tag in app.lower() and tag not in buildCmd.lower():
            print("app [{}] 中包含({})关键字，但是编译命令（{}）不存在，清检查编译命令是否正确".format(app, tag, buildCmd))
            exit()

    if pubEnv == 'pre':
        buildCmd = {
            APP_EASYBOSS: 'build:easyboss-pre',
        }.get(app, buildCmd)

        if app in [APP_YKT, APP_YKT_DIGSHOW,APP_YKT_AI]:
            buildCmd += '-pre'
    
    cmd = '{} && yarn && VITE_BUILD_ENV={} yarn {}'.format(baseCmd, pubEnv, buildCmd)

    print("start run command " + cmd)
    if buildCmd in ['xxweb:build', 'xxweb:build.digshow']:
        print("start xxweb:build for os.system ")
        os.system(cmd)
    else:
        CliTool.processCmd(cmd)

    if(app in [APP_EARTH, APP_ERP_DESKTOP, APP_ERP_DIANJIUFANG, APP_ERP_BAIKE, APP_EARTH_MXZ]):
        cmd = baseCmd + ' && rm -rf dist distv1 && /bin/bash scripts/bundle.sh '
        print("start run command " + cmd)
        CliTool.processCmd(cmd)

        cmd = baseCmd + ' && mv dist disttmp && mv disttmp/* ./ && rm -rf disttmp'
        print("start run command " + cmd)
        CliTool.processCmd(cmd)

    if(app in [APP_YKT, APP_YKT_DIGSHOW, APP_YKT_AI, APP_MKT_EDITOR, APP_BARCODE_EDITOR]):
        cmd = baseCmd + ' && rm -rf dist && mv packages/xiuxiu-web/dist ./'
        print("start run command " + cmd)
        CliTool.processCmd(cmd)

###erpchat 前端增量发布
isIncPub = False
if app == APP_ERP_CHAT and pubEnv == 'pre':
    isIncPub = True

##检查dist编译结果是否存在
fsDIstDir = {
    APP_TMS_MOBILE: 'mobile/dist',
    APP_TMS_APP: 'tms-applet/dist/build/h5',
    APP_ACN_DS_v2: 'web/build',
}.get(app, 'web/dist')

distDir = localSrc + fsDIstDir
distv1Dir = localSrc + 'web/distv1'
if os.path.isfile(distDir + '/index.html') is False:
    print(distDir + ' 编译文件不存在!')
    exit()
    
if (app in [APP_EARTH, APP_ERP_DESKTOP, APP_ERP_DIANJIUFANG, APP_EASYBOSS, APP_ERP_BAIKE, APP_EARTH_MXZ]) and os.path.isfile(distv1Dir + '/index.html') is False:
    print(distv1Dir + ' web/distv1 编译文件不存在!')
    exit()

# Get module based on app and pubEnv
module = get_app_module(app, pubEnv)

pubPort = {
    APP_JOY_ORDER: '3389',
    APP_JOY_ORDER_RY: '3389',
    APP_JOY_GOLD: '3389',
}.get(app, '8873')

##获取对应的hosts文件
##当环境是real的时候只发布sw的主机
only_sw = (pubEnv == 'real')
file_host = get_idc_host_file(idc=idc, only_sw=only_sw)
if file_host is False:
    print("app {} 对应的发布文件不存在, 请检查".format(app))
    exit()
    
##完整的文件路径  
file_full_path = "{}/conf/hosts/{}".format(os.path.dirname(sys.argv[0]), file_host)
if os.path.isfile(file_full_path) is False:
    print("hosts file {} 不存在,  请检查".format(file_full_path))
    exit()
    
ipsMap = CliTool.getIpsMap(file_full_path, isIntra, pubPort, module)

if (pubEnv == 'pre'):
    switcher = {
        APP_EARTH: 'pre,jst-pre',
    }
    pubEnv = switcher.get(app, 'pre')

envList = CliTool.getEnvList(pubEnv, ipsMap, isIntra)

ips = {}
for env in envList:
    ips = dict(ips, **ipsMap[env])

##real环境只发布主机名称包含-sw的机器 (pub发布机除外)
if 'real' in envList and idc != 'pub':
    ips = {k: v for k, v in ips.items() if '-sw' in v.get('hostname', '')}
    print("real环境只发布sw主机, 过滤后剩余 {} 台".format(len(ips)))


rsync_del='--del' if isIncPub is False else ''
cmdTpl = 'rsync -%s --delay-updates {} --stats --port=%s --password-file={} --timeout={}'.format(rsync_del, localPwdFile, timeout)

sshCmdTpl = 'rsync -%s -e ssh --delay-updates --del --stats --port=%s --timeout=' + timeout

cmdTplExt = ''
if onlyPubWeb is True:
    if app in [APP_TMS_MOBILE]:
        cmdTplExt += ' --exclude=/api/* --include=/mobile/dist/ '
    elif app in [APP_TMS_APP]:
        cmdTplExt += ' --exclude=/api/* --include=/tms-applet/dist/ '
    else:
        cmdTplExt += ' --exclude=/api/* --include=/web/dist/ --include=/web/distv1/ '
     
else:
    cmdTplExt += ' --include=/api/ --include=/web/dist/ --include=/web/distv1/ '

if app in [APP_TMS, APP_TMS_APP, APP_TMS_DESKTOP, APP_TMS_MOBILE]:
    cmdTplExt += ' --exclude=/mobile/* --exclude=/tms-applet/*  '

cmdTplExt += ' --exclude=/web/* --exclude=/log ' + CliTool.excludeFile() + localSrc

cmdTpl += cmdTplExt + ' www@%s::%s/'
sshCmdTpl += cmdTplExt + ' root@%s:/alidata/%s/'

##web发布只发布dist目录，无需检查PHP语法
syntax_check = False

Ct = CliTool()
Ct.publish(ips, mode, cmdTpl, False, sshCmdTpl, php_syntax_check = syntax_check)
