import { isArray as g, isObject as b } from "lodash";
class o {
  /**
   * 替换URL中的变量
   * @param url URL
   * @param variableData 变量数据
   * @returns 解析后的URL
   */
  static replaceURLVariables(t, n) {
    try {
      const a = t.match(/\${(.*?)}/g);
      if (a)
        for (let e = 0; e < a.length; e++) {
          const r = a[e].substring(2, a[e].length - 1), i = o.extractVariableName(r), s = n.find((l) => l.name === i);
          if (!s)
            continue;
          const c = o.getNestedValue(s._value, r.substring(i.length));
          t = t.replaceAll(a[e], c);
        }
      return t;
    } catch {
      return t;
    }
  }
  /**
   * 替换对象中的变量
   * @param obj 对象
   * @param variableData 变量数据
   * @returns 解析后的对象
   */
  static replaceObjectVariables(t, n) {
    try {
      let a = JSON.stringify(t);
      const e = a.match(/\$g{(.*?)}/g);
      if (e) {
        for (let r = 0; r < e.length; r++) {
          const i = e[r].substring(3, e[r].length - 1), s = this.extractVariableName(i), c = n.find((u) => u.name === s);
          if (!c)
            continue;
          const l = this.getNestedValue(c._value, i.substring(s.length));
          a = a.replaceAll(e[r], l);
        }
        return JSON.parse(a);
      }
      return t;
    } catch {
      return t;
    }
  }
  /**
   * 替换字符串中的变量
   * @param str 字符串
   * @param variableData 变量数据
   * @returns 解析后的字符串
   */
  static replaceStringVariables(t, n) {
    try {
      const a = t.match(/\$g{(.*?)}/g);
      if (a)
        for (let e = 0; e < a.length; e++) {
          const r = a[e].substring(3, a[e].length - 1), i = this.extractVariableName(r), s = n.find((l) => l.name === i);
          if (!s)
            continue;
          const c = this.getNestedValue(s._value, r.substring(i.length));
          t = t.replaceAll(a[e], c);
        }
      return t;
    } catch {
      return t;
    }
  }
  /**
   * 获取URL中的变量名
   * @param url URL
   * @returns 变量名
   */
  static getURLVariableNames(t) {
    const n = [], a = t.match(/\${(.*?)}/g);
    if (a)
      for (let e = 0; e < a.length; e++) {
        const r = a[e].substring(2, a[e].length - 1), i = o.extractVariableName(r);
        n.push(i);
      }
    return n;
  }
  /**
   * 获取对象中的变量名
   * @param obj 对象
   * @returns 变量名
   */
  static getObjectVariableNames(t) {
    const n = [], e = JSON.stringify(t).match(/\$g{(.*?)}/g);
    if (e)
      for (let r = 0; r < e.length; r++) {
        const i = e[r].substring(3, e[r].length - 1), s = this.extractVariableName(i);
        n.push(s);
      }
    return n;
  }
  /**
   * 获取字符串中的变量名
   * @param str 字符串
   * @returns 变量名
   */
  static getStringVariableNames(t) {
    const n = [], a = t.match(/\$g{(.*?)}/g);
    if (a)
      for (let e = 0; e < a.length; e++) {
        const r = a[e].substring(3, a[e].length - 1), i = this.extractVariableName(r);
        n.push(i);
      }
    return n;
  }
  /**
   * 解析环境变量
   * @param url URL
   * @param environments 环境变量
   * @returns 解析后的环境变量
   */
  static replaceEnvVariables(t, n) {
    try {
      let a = "";
      if (!t.includes("http") && n) {
        const e = n.filter((r) => r.selected);
        e && g(e) && e.length > 0 && (a = e[0].envBaseUrl || "");
      }
      return a;
    } catch {
      return "";
    }
  }
  /**
   * 返回空数据
   * @param id 数据源 ID
   * @returns 空数据
   */
  static noneData(t) {
    return {
      id: t,
      finalKeyData: [],
      finalUserData: { id: t, data: [] },
      filteredData: [],
      rawData: [],
      noMappingData: []
    };
  }
  /**
   * 获取环境变量
   * @returns 环境变量
   */
  static getEnvironments() {
    let t = sessionStorage.getItem("currentApiEnvironments");
    return t && (t = JSON.parse(t)), t;
  }
  /**
   * 设置环境变量
   * @param environments 环境变量
   */
  static setEnvironments(t) {
    sessionStorage.setItem("currentApiEnvironments", JSON.stringify(t));
  }
  /**
   * 获取变量数据
   * @returns 变量数据
   */
  static getVariableData() {
    let t = sessionStorage.getItem("currentVariableData");
    return t && (t = JSON.parse(t)), t;
  }
  /**
   * 设置变量数据
   * @param variableData 变量数据
   */
  static setVariableData(t) {
    sessionStorage.setItem("currentVariableData", JSON.stringify(t));
  }
  /**
   * 检查 WebSocket 是否已存在且有效
   * @param wsInstances WebSocket 实例
   * @param tId WebSocket 实例的 ID
   * @param sourceId WebSocket 实例的源 ID
   * @returns 是否有效
   */
  static hasValidWebSocket(t, n, a) {
    const e = t.get(n);
    if (!e) return !1;
    for (const r of e)
      if (r.getId() === a && r.isConnected())
        return !0;
    return !1;
  }
  /**
   * 只在必要时清理 WebSocket 连接
   * @param wsInstances WebSocket 实例
   * @param sourceIds 源 ID
   * @param tId WebSocket 实例的 ID
   */
  static cleanupPreviousWebSockets(t, n, a) {
    const e = t.get(a);
    e && (e.forEach((r) => {
      n.includes(r.getId()) || (r.disconnect(), e.delete(r));
    }), e.size === 0 && t.delete(a));
  }
  /**
   * 使用 Function 构造函数获取对象中的嵌套值（更简洁但安全性较低）
   * @param obj 源对象
   * @param path 路径字符串，例如 ".a[0].value"
   * @returns 获取到的值，如果路径不存在则返回 undefined
   */
  static getNestedValue(t, n) {
    try {
      return n ? new Function("obj", `return obj${n}`)(t) : b(t) || g(t) ? JSON.stringify(t) : t;
    } catch {
      return;
    }
  }
  /**
   * 从路径字符串中提取变量名
   * @param path 路径字符串，例如 "测试.test" 或 "333[0].aa"
   * @returns 提取出的变量名
   */
  static extractVariableName(t) {
    const n = t.match(/^([\u4e00-\u9fa5a-zA-Z0-9_][\u4e00-\u9fa5a-zA-Z0-9_]*)/);
    return n ? n[1] : "";
  }
}
export {
  o as DataSourceUtils
};
