const process = require('process');
const os = require('os');
const path = require('path');

// 保存原始dlopen
const dlopenOrig = process.dlopen;

let wrapperSession;
let wrapperNodeApi;
let wrapperLoginService;
let getWebUiUrlFunc;
let ncCallback = () => { };
let napCatInitialized = false; // 添加一个标志

function createServiceProxy (ServiceName) {
  return new Proxy(() => { }, {
    get: (target, FunctionName) => {
      if (ServiceName === 'NodeIQQNTWrapperSession' && FunctionName === 'create') {
        return () => new Proxy({}, {
          get: function (target, ClassFunName, receiver) {
            return function () {
              if (ClassFunName === 'init') {
                const origin = arguments[3].onOpentelemetryInit;
                arguments[3].onOpentelemetryInit = function (result) {
                  origin(...arguments);
                  if (result.is_init) {
                    ncCallback();
                  }
                };
              }
              const ret = wrapperSession[ClassFunName](...arguments);
              return ret;
            };
          },
        });
      }
      if (ServiceName === 'NodeIKernelLoginService' && FunctionName === 'get') {
        return () => wrapperLoginService;
      }
      return wrapperNodeApi[ServiceName][FunctionName];
    },
  });
}

function clearHook () {
  process.dlopen = dlopenOrig;
}

async function initializeNapCat () {
  console.log('[NapCat] [Info] 开始初始化NapCat');
  try {
    const currentPath = path.dirname(__filename);
    const { NCoreInitFramework, getWebUiUrl } = await import('file://' + path.join(currentPath, './napcat.mjs'));
    getWebUiUrlFunc = getWebUiUrl;
    await NCoreInitFramework(wrapperSession, wrapperLoginService, (callback) => { ncCallback = callback; });
  } catch (error) {
    console.log('[NapCat] [Error] 初始化NapCat', error);
  }
}

process.dlopen = function (module, filename, flags = os.constants.dlopen.RTLD_LAZY) {
  const dlopenRet = dlopenOrig(module, filename, flags);
  if (!filename.includes('wrapper.node') || napCatInitialized) return dlopenRet;
  napCatInitialized = true; // 初始化完成后设置标志
  clearHook();
  wrapperNodeApi = module.exports;
  wrapperLoginService = wrapperNodeApi.NodeIKernelLoginService.get();
  wrapperSession = wrapperNodeApi.NodeIQQNTWrapperSession.create();

  initializeNapCat().then().catch();

  module.exports = new Proxy({}, {
    get: (target, ServiceName) => {
      if (ServiceName === 'NodeIKernelLoginService' || ServiceName === 'NodeIQQNTWrapperSession') {
        return createServiceProxy(ServiceName);
      }
      return wrapperNodeApi[ServiceName];
    },
  });

  return dlopenRet;
};

module.exports = {
  NCgetWebUiUrl: async () => {
    if (!getWebUiUrlFunc) {
      console.log('[NapCat] [Error] 未初始化完成');
      return '';
    }
    return await getWebUiUrlFunc();
  },
};
