import { extendType } from "./extends";
import { ctor } from "./global";
import { initIORedis } from "./ioredis";
import { initGcType } from "./jsonType";
import { createLng } from "./lng";
import { initMongoDB } from "./setMongodb";
import { initRedis } from "./setRedis";

var path = require('path');
var scriptName = path.basename(__filename);

export function patchFun(target: any, key: string, descriptor: PropertyDescriptor) {
    let scriptName;
    try {
        throw new Error();
    } catch (e) {
        let caller = (e.stack.split("\n").slice(2)[0].split("\\").slice(-2));
        scriptName = caller[0].split('(')[1].split(':')[0];
    }

    if(!scriptName){
        console.log('获取不到脚本名');
        return;
    }
    const originalMethod = descriptor.value;
    descriptor.value = function(...args: any[]) {
        //@ts-ignore
        G.mongodb.collection("_patch_run_log").findOne({ fileName: scriptName, funName: key }).then(async runed=>{
            if(runed){
                console.log(`脚本${scriptName}已经执行过${key}方法，跳过`);
                return (null as any);
            }

            console.log(`调用了${scriptName}脚本里的${key}方法，参数为：${args}`);
            const result = await originalMethod.apply(this, args);
            console.log(`执行结果为：${result}`);
    
            //@ts-ignore
            await G.mongodb.collection("_patch_run_log").insertOne({ 
                "fileName": scriptName, 
                "funName": key as any,
                "ctime":Date.now(),
                "res":result
            });
            return (result as any);
        });
    }
}

export async function patchInit() {
    await patchStart();
}

async function patchStart() {
    //扩展框架
    extendType();
    //游戏配置提示文件
    initGcType();
    //连接mongodb
    await initMongoDB();
    //连接redis
    await initRedis();
    await initIORedis();
}
// //定义全局变量
ctor();
//创建语言包
createLng();