package com.ch.jedge.jbot.knbase;

import com.alibaba.fastjson.JSONArray;
import com.ch.jedge.jbot.JedgeBotGptService;
import com.ch.jedge.jbot.session.JedgeServiceSession;
import com.changhong.jedge.JMgbusModual;
import com.changhong.qlib.QData;
import com.changhong.qlib.util.Log.ISLog;
import com.changhong.qlib.util.file.FileUtils;

import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import static com.ch.jedge.jbot.agent.JedgeGdeConsts.sval_default_domain_fn;

/**
 *  这是一个对话引擎：
 *      默认条件下，加载各种对话域：
 *          —— 对输入进行接管，
 *          —— 动态更新词库、意图库等。
 *          —— 更新任务及其列表等。
 *
 */
public class JedgeGptDialogEngine {

    protected final Map<String, JedgeGptApp> gdeApps = new HashMap<>();
    private JMgbusModual mgModule;
    private JedgeBotGptService mgService;

    public boolean loadDialogDomains() {
        if(mgModule==null || mgService==null) {
            ISLog.stackLog("GptDialogEngine", "Module or Service Not set!");
            return false;
        }

        String path = FileUtils.contactPath(".", "cfg", "domains");
        //从指定路径加载，未来应该是一个zip格式的包。自动解压该软件包，并加载各个domain。
        FileUtils.listSubDirs(path, file -> {
            String appPath = file.getAbsolutePath();
            String ha = FileUtils.contactPath(appPath, sval_default_domain_fn);
            if(new File(ha).exists()) {
                loadDialogApp(appPath);
            }
            return null;
        });

        return true;
    }

    private void loadDialogApp(String appPath) {
        JedgeGptApp app = new JedgeGptApp(mgModule, mgService, appPath);
        if(!app.loadDomains()) return;
        synchronized (gdeApps) {
            gdeApps.put(app.getAppName().toLowerCase(Locale.ROOT), app);
        }

    }

    public void setContext(JMgbusModual module, JedgeBotGptService service) {
        this.mgModule = module;
        this.mgService = service;
    }

    public boolean handleKnTalk(JedgeServiceSession s, String gdeApp, String query) {
        gdeApp = gdeApp.toLowerCase(Locale.ROOT);
        synchronized (gdeApps) {
            if(!gdeApps.containsKey(gdeApp)) return false;
            JedgeGptApp app = gdeApps.get(gdeApp);
            if(app==null) return false;
            return app.handleQuery(s, query);
        }
    }

    public JedgeGptApp getGdeApp(String appKey) {
        synchronized (gdeApps) {
            return gdeApps.get(appKey.toLowerCase(Locale.ROOT));
        }
    }

    public void onHeartbeat() {
        synchronized (gdeApps) {
            for(JedgeGptApp app : gdeApps.values()) {
                app.onHeartBeat();
            }
        }
    }

    public JSONArray getGdeAppList() {
        JSONArray re = new JSONArray();
        synchronized (gdeApps) {
            for(String app : gdeApps.keySet()) {
                re.add(new QData().putString("key", app).putString("name","应用"+app).asJsonObject());
            }
        }
        return re;
    }
}
