#!/usr/bin/env node
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result["default"] = mod;
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const Commander = require("commander");
const engine_1 = require("./engine");
const Case = __importStar(require("../../case/src"));
const Utils = __importStar(require("../../util/src"));
const Path = __importStar(require("path"));
const FS = __importStar(require("fs"));
const Connect = __importStar(require("../../connect/src"));
const Request = __importStar(require("request"));
const UrlEncode = __importStar(require("urlencode"));
const pkg = require('../../../package.json');
Commander.version(`${pkg.version}`);
Commander
    .command('build')
    .description('编译工程')
    .option('-p, --path <v>', '目标工程路径')
    .option('-d, --dist <v>', '编译结果路径')
    .option('-a, --all <v>', '批量将同一文件夹下的所有Cube有效工程进行编译，编译结果将存放到每个工程的dist目录下')
    .action(cmd => {
    Utils.Console.info(`编译工程
        工程路径: ${cmd.path}
        结果路径: ${cmd.dist}
        批量工程: ${cmd.all}
        `);
    if (cmd.all) {
        engine_1.AntCube.pack.buildAllProjects(cmd.all).then(value => {
            Utils.Console.info(`编译完成`);
            process.exit(0);
        }).catch(reason => {
            Utils.Console.error(`${reason}`);
            process.exit(1);
        });
    }
    else {
        const dist = cmd.dist ? cmd.dist : Path.join(cmd.path, '/dist');
        engine_1.AntCube.pack.buildProject(cmd.path, dist).then(value => {
            if (value.success) {
                Utils.Console.info(`编译完成，编译产物路径 [${dist}]`);
                process.exit(0);
            }
            else {
                Utils.Console.error(`${value.message}`);
                process.exit(1);
            }
        }).catch(reason => {
            Utils.Console.error(`build project failure\n${reason.message}`);
            process.exit(1);
        });
    }
});
Commander
    .command('server')
    .description('启动通信服务器')
    .action(cmd => {
    Connect.launch().then(value => {
        Utils.Console.info(`服务启动完毕，请勿关闭终端窗口`);
        Connect.Router.launch();
    }).catch(reason => {
        Utils.Console.error(`服务启动异常 [${reason}]`);
        process.exit(1);
    });
});
Commander
    .command('qrcode')
    .description('显示可供连接的二维码')
    .action(cmd => {
    Request.get(`http://${Connect.Singleton.IP}:${Connect.Singleton.PORT}/api?action=qrcode`, (error, response, body) => {
        if (error) {
            Utils.Console.error(`${error}`);
        }
        else {
            Utils.Console.info(`\n${body}`);
        }
        process.exit(0);
    });
});
Commander
    .command('device')
    .description('显示当前连接的设备列表')
    .action(cmd => {
    Request.get(`http://${Connect.Singleton.IP}:${Connect.Singleton.PORT}/api?action=devices`, (error, response, body) => {
        if (error) {
            Utils.Console.error(`${error}`);
        }
        else {
            const sessions = body.length > 0 ? JSON.parse(body) : [];
            const names = new Array();
            if (sessions.length > 0) {
                for (const { name: n } of sessions) {
                    names.push(n);
                }
            }
            Utils.Console.info(`\n${names.length > 0 ? names.join('\n') : '无连接设备'}`);
        }
        process.exit(0);
    });
});
Commander
    .command('config')
    .description('配置accore工具')
    .option('-d, --dbpath <v>', '配置工具关联的DB数据库路径，目前在使用测试相关功能前必须配置')
    .action(cmd => {
    if (cmd.dbpath) {
        Case.Config.updateStoreDB(cmd.dbpath).then(value => {
            Utils.Console.info(`DB数据库配置成功 [${cmd.dbpath}]`);
            process.exit(0);
        }).catch(reason => {
            Utils.Console.error(`DB数据库配置失败 : ${reason}`);
            process.exit(2);
        });
    }
    else {
        Utils.Console.error(`未识别的参数`);
        process.exit(1);
    }
});
Commander
    .command('preview')
    .description('预览指定工程')
    .option('-p, --path <v>', '待预览工程的根目录（包含 package.json 文件的目录）')
    .action(cmd => {
    Request.get(`http://${Connect.Singleton.IP}:${Connect.Singleton.PORT}/api?action=preview&path=${UrlEncode.encode(Path.resolve('./', cmd.path))}`, (error, response, body) => {
        if (error) {
            Utils.Console.error(`${error}`);
        }
        process.exit(0);
    });
});
Commander
    .command('runcase')
    .description('执行用例')
    .option('-d, --device [v]', '运行case的设备ID，iOS端不可缺省并且仅支持模拟器，Android端可缺省')
    .option('-o, --optionPath [v]', '配置文件路径，json字符串格式，可通过caseIDs字段指定待执行的用例ID，缺省时执行所有用例')
    .option('-a, --alipay', '是否在支付宝环境执行，默认为false')
    .option('-p, --platform [v]', '运行case的平台，0代表iOS，1代表Android，缺省时代表在iOS环境内中运行')
    .option('-A, --app [v]', '运行case的应用ID，缺省时代表在独立DemoApp中执行')
    .option('-s, --alipayScheme', '组装支付宝环境适用的用例scheme，可通过--optionPath参数指定待组装的用例ID，默认组装所有用例')
    .action(cmd => {
    Utils.Console.info(`执行用例 : 
    device      : ${cmd.device}
    alipay      : ${cmd.alipay}
    platform    : ${cmd.platform}
    app         : ${cmd.app}
    optionPath  : ${cmd.optionPath}
    schemme     : ${cmd.alipayScheme}
        `);
    if (cmd.alipayScheme) {
        Case.Driver.Alipay.buildSchemes(cmd.optionPath).then(value => {
            const path = Path.join(process.env.HOME ? process.env.HOME : '', 'Desktop/RubikAlipaySchemes.json');
            FS.writeFileSync(path, JSON.stringify(value, undefined, 2));
            Utils.Console.info(`scheme组装完成，请查阅 [${path}]`);
            process.exit(0);
        }).catch(reason => {
            Utils.Console.error(`scheme组装失败 : ${reason}`);
            process.exit(2);
        });
    }
    else {
        Case.Driver.run(cmd.device, cmd.optionPath, cmd.alipay, (cmd.platform ? Number(cmd.platform) : undefined), cmd.app).then(value => {
            Utils.Console.info(`用例执行完成`);
            process.exit(0);
        }).catch(reason => {
            Utils.Console.error(`用例执行失败 : ${reason}`);
            process.exit(1);
        });
    }
});
Commander
    .command('buildcase')
    .description('构建用例')
    .option('-p, --path <v>', 'case所在工程根目录，支持将多个工程放置在同一个目录下批量处理')
    .action(cmd => {
    Utils.Console.info(`***********
    用例工程(必要) : ${cmd.path}
        `);
    if (!cmd.path) {
        Utils.Console.error(`缺少必要参数`);
        process.exit(2);
    }
    Case.build(cmd.path).then(value => {
        Utils.Console.info(`用例构造完成`);
        Case.Store.updateCases(value).then(value => {
            Utils.Console.info(`用例更新完成`);
            process.exit(0);
        }).catch(reason => {
            Utils.Console.error(`用例更新失败 : ${reason}`);
            process.exit(2);
        });
    }).catch(reason => {
        Utils.Console.error(`用例构建失败 : ${reason}`);
        process.exit(1);
    });
});
Commander
    .command('checkcase')
    .description('校验特征')
    .option('-c, --casePath <v>', '待校验用例结果集根目录')
    .option('-b, --baselinePath <v>', '待校验用例基线根目录')
    .action(cmd => {
    if (cmd.casePath && cmd.baselinePath) {
        Utils.Console.info(`开始校验 [${cmd.casePath}]`);
        Case.Checker.check(cmd.casePath, cmd.baselinePath).then(value => {
            Utils.Console.info(`校验完成 : 总计 [${value.length}] 条结果`);
            Case.Checker.report(value).then(value => { }).catch(reason => {
                Utils.Console.error(`生成报告异常 : ${reason}`);
            });
        }).catch(reason => {
            Utils.Console.error(`校验异常 : ${reason}`);
        });
    }
    else {
        Utils.Console.error(`缺少必要参数`);
        process.exit(1);
    }
});
Commander
    .command('tinysplit')
    .description('拆分用例')
    .option('-p, --path <v>', '小程序工程根路径')
    .action(cmd => {
    if (cmd.path) {
        Utils.Console.info(`开始拆分 [${cmd.path}]`);
        Case.Suit.CSS.split(cmd.path).then((value) => __awaiter(void 0, void 0, void 0, function* () {
            Utils.Console.info(`拆分完成`);
            process.exit(0);
        })).catch(reason => {
            Utils.Console.error(`拆分失败 : ${reason}`);
            process.exit(2);
        });
    }
    else {
        Utils.Console.error(`缺少必要参数`);
        process.exit(1);
    }
});
Commander.parse(process.argv);
process.on("beforeExit", e => {
    console.log('beforeExit');
    Utils.Net.cleanPort(Connect.Singleton.PORT);
});
process.on("uncaughtException", e => {
    console.log(`uncaughtException:\n${e}`);
});
//# sourceMappingURL=cli.js.map