package io.jpom.system.init;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.jiangzeyin.common.DefaultSystemLog;
import cn.jiangzeyin.common.PreLoadClass;
import cn.jiangzeyin.common.PreLoadMethod;
import cn.jiangzeyin.common.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import io.jpom.common.JpomManifest;
import io.jpom.common.Type;
import io.jpom.model.data.NodeModel;
import io.jpom.model.system.AgentAutoUser;
import io.jpom.service.node.NodeService;
import io.jpom.system.ConfigBean;
import io.jpom.system.ServerConfigBean;
import io.jpom.util.JsonFileUtil;
import io.jpom.util.JvmUtil;
import sun.jvmstat.monitor.MonitoredVm;
import sun.jvmstat.monitor.VmIdentifier;

import java.io.File;
import java.util.List;

/**
 * 自动导入本机节点
 *
 * @author jiangzeyin
 * @date 2019/4/18
 */
@PreLoadClass
public class AutoImportLocalNode {

    private static final String AGENT_MAIN_CLASS = "io.jpom.JpomAgentApplication";
    private static NodeService nodeService;

    @PreLoadMethod
    private static void install() {
        File file = FileUtil.file(ConfigBean.getInstance().getDataPath(), ServerConfigBean.INSTALL);
        if (file.exists()) {
            return;
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("installId", IdUtil.fastSimpleUUID());
        jsonObject.put("installTime", DateTime.now().toString());
        jsonObject.put("desc", "请勿删除此文件,服务端安装id和插件端互通关联");
        JsonFileUtil.saveJson(file.getAbsolutePath(), jsonObject);
    }

    @PreLoadMethod
    private static void loadAgent() {
        nodeService = SpringUtil.getBean(NodeService.class);
        List<NodeModel> list = nodeService.list();
        if (list != null && !list.isEmpty()) {
            return;
        }
        //
        try {
            List<MonitoredVm> monitoredVms = JvmUtil.listMainClass(AGENT_MAIN_CLASS);
            monitoredVms.forEach(monitoredVm -> {
                VmIdentifier vmIdentifier = monitoredVm.getVmIdentifier();
                findPid(vmIdentifier.getUserInfo());
            });
        } catch (Exception e) {
            DefaultSystemLog.getLog().error("自动添加本机节点错误", e);
        }
    }

    private static void findPid(String pid) {
        File file = ConfigBean.getInstance().getApplicationJpomInfo(Type.Agent);
        if (!file.exists() || file.isDirectory()) {
            return;
        }
        // 比较进程id
        String json = FileUtil.readString(file, CharsetUtil.CHARSET_UTF_8);
        JpomManifest jpomManifest = JSONObject.parseObject(json, JpomManifest.class);
        if (!pid.equals(String.valueOf(jpomManifest.getPid()))) {
            return;
        }
        // 判断自动授权文件是否存在
        String path = ConfigBean.getInstance().getAgentAutoAuthorizeFile(jpomManifest.getDataPath());
        if (!FileUtil.exist(path)) {
            return;
        }
        json = FileUtil.readString(path, CharsetUtil.CHARSET_UTF_8);
        AgentAutoUser autoUser = JSONObject.parseObject(json, AgentAutoUser.class);
        // 判断授权信息
        //
        NodeModel nodeModel = new NodeModel();
        nodeModel.setUrl(StrUtil.format("127.0.0.1:{}", jpomManifest.getPort()));
        nodeModel.setName("本机");
        nodeModel.setId("localhost");
        //
        nodeModel.setLoginPwd(autoUser.getAgentPwd());
        nodeModel.setLoginName(autoUser.getAgentName());
        //
        nodeModel.setOpenStatus(true);
        nodeService.addItem(nodeModel);
        DefaultSystemLog.getLog().info("自动添加本机节点成功:" + nodeModel.getId());
    }
}