// prettier-ignore
/* eslint-disable */
// @ts-nocheck
/* auto-generated by NAPI-RS */

import { createRequire } from 'node:module'
const require = createRequire(import.meta.url);
const __dirname = new URL(".", import.meta.url).pathname;

const { readFileSync } = require("node:fs");
let nativeBinding = null;
const loadErrors = [];

const isMusl = () => {
  let musl = false;
  if (process.platform === "linux") {
    musl = isMuslFromFilesystem();
    if (musl === null) {
      musl = isMuslFromReport();
    }
    if (musl === null) {
      musl = isMuslFromChildProcess();
    }
  }
  return musl;
};

const isFileMusl = (f) => f.includes("libc.musl-") || f.includes("ld-musl-");

const isMuslFromFilesystem = () => {
  try {
    return readFileSync("/usr/bin/ldd", "utf-8").includes("musl");
  } catch {
    return null;
  }
};

const isMuslFromReport = () => {
  let report = null;
  if (typeof process.report?.getReport === "function") {
    process.report.excludeNetwork = true;
    report = process.report.getReport();
  }
  if (!report) {
    return null;
  }
  if (report.header && report.header.glibcVersionRuntime) {
    return false;
  }
  if (Array.isArray(report.sharedObjects)) {
    if (report.sharedObjects.some(isFileMusl)) {
      return true;
    }
  }
  return false;
};

const isMuslFromChildProcess = () => {
  try {
    return require("child_process")
      .execSync("ldd --version", { encoding: "utf8" })
      .includes("musl");
  } catch (e) {
    // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
    return false;
  }
};

function requireNative() {
  if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
    try {
      return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
    } catch (err) {
      loadErrors.push(err);
    }
  } else if (process.platform === "android") {
    if (process.arch === "arm64") {
      try {
        return require("./hive_router_query_planner.android-arm64.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else if (process.arch === "arm") {
      try {
        return require("./hive_router_query_planner.android-arm-eabi.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else {
      loadErrors.push(
        new Error(`Unsupported architecture on Android ${process.arch}`)
      );
    }
  } else if (process.platform === "win32") {
    if (process.arch === "x64") {
      if (
        process.report?.getReport?.()?.header?.osName?.startsWith?.("MINGW")
      ) {
        try {
          return require("./hive_router_query_planner.win32-x64-gnu.node");
        } catch (e) {
          loadErrors.push(e);
        }
      } else {
        try {
          return require("./hive_router_query_planner.win32-x64-msvc.node");
        } catch (e) {
          loadErrors.push(e);
        }
      }
    } else if (process.arch === "ia32") {
      try {
        return require("./hive_router_query_planner.win32-ia32-msvc.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else if (process.arch === "arm64") {
      try {
        return require("./hive_router_query_planner.win32-arm64-msvc.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else {
      loadErrors.push(
        new Error(`Unsupported architecture on Windows: ${process.arch}`)
      );
    }
  } else if (process.platform === "darwin") {
    try {
      return require("./hive_router_query_planner.darwin-universal.node");
    } catch (e) {
      loadErrors.push(e);
    }
    if (process.arch === "x64") {
      try {
        return require("./hive_router_query_planner.darwin-x64.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else if (process.arch === "arm64") {
      try {
        return require("./hive_router_query_planner.darwin-arm64.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else {
      loadErrors.push(
        new Error(`Unsupported architecture on macOS: ${process.arch}`)
      );
    }
  } else if (process.platform === "freebsd") {
    if (process.arch === "x64") {
      try {
        return require("./hive_router_query_planner.freebsd-x64.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else if (process.arch === "arm64") {
      try {
        return require("./hive_router_query_planner.freebsd-arm64.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else {
      loadErrors.push(
        new Error(`Unsupported architecture on FreeBSD: ${process.arch}`)
      );
    }
  } else if (process.platform === "linux") {
    if (process.arch === "x64") {
      if (isMusl()) {
        try {
          return require("./hive_router_query_planner.linux-x64-musl.node");
        } catch (e) {
          loadErrors.push(e);
        }
      } else {
        try {
          return require("./hive_router_query_planner.linux-x64-gnu.node");
        } catch (e) {
          loadErrors.push(e);
        }
      }
    } else if (process.arch === "arm64") {
      if (isMusl()) {
        try {
          return require("./hive_router_query_planner.linux-arm64-musl.node");
        } catch (e) {
          loadErrors.push(e);
        }
      } else {
        try {
          return require("./hive_router_query_planner.linux-arm64-gnu.node");
        } catch (e) {
          loadErrors.push(e);
        }
      }
    } else if (process.arch === "arm") {
      if (isMusl()) {
        try {
          return require("./hive_router_query_planner.linux-arm-musleabihf.node");
        } catch (e) {
          loadErrors.push(e);
        }
      } else {
        try {
          return require("./hive_router_query_planner.linux-arm-gnueabihf.node");
        } catch (e) {
          loadErrors.push(e);
        }
      }
    } else if (process.arch === "loong64") {
      if (isMusl()) {
        try {
          return require("./hive_router_query_planner.linux-loong64-musl.node");
        } catch (e) {
          loadErrors.push(e);
        }
      } else {
        try {
          return require("./hive_router_query_planner.linux-loong64-gnu.node");
        } catch (e) {
          loadErrors.push(e);
        }
      }
    } else if (process.arch === "riscv64") {
      if (isMusl()) {
        try {
          return require("./hive_router_query_planner.linux-riscv64-musl.node");
        } catch (e) {
          loadErrors.push(e);
        }
      } else {
        try {
          return require("./hive_router_query_planner.linux-riscv64-gnu.node");
        } catch (e) {
          loadErrors.push(e);
        }
      }
    } else if (process.arch === "ppc64") {
      try {
        return require("./hive_router_query_planner.linux-ppc64-gnu.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else if (process.arch === "s390x") {
      try {
        return require("./hive_router_query_planner.linux-s390x-gnu.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else {
      loadErrors.push(
        new Error(`Unsupported architecture on Linux: ${process.arch}`)
      );
    }
  } else if (process.platform === "openharmony") {
    if (process.arch === "arm64") {
      try {
        return require("./hive_router_query_planner.openharmony-arm64.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else if (process.arch === "x64") {
      try {
        return require("./hive_router_query_planner.openharmony-x64.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else if (process.arch === "arm") {
      try {
        return require("./hive_router_query_planner.openharmony-arm.node");
      } catch (e) {
        loadErrors.push(e);
      }
    } else {
      loadErrors.push(
        new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`)
      );
    }
  } else {
    loadErrors.push(
      new Error(
        `Unsupported OS: ${process.platform}, architecture: ${process.arch}`
      )
    );
  }
}

nativeBinding = requireNative();

if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
  let wasiBinding = null;
  let wasiBindingError = null;
  try {
    wasiBinding = require("./hive_router_query_planner.wasi.cjs");
    nativeBinding = wasiBinding;
  } catch (err) {
    if (process.env.NAPI_RS_FORCE_WASI) {
      wasiBindingError = err;
    }
  }
  if (process.env.NAPI_RS_FORCE_WASI === "error" && !wasiBinding) {
    const error = new Error(
      "WASI binding not found and NAPI_RS_FORCE_WASI is set to error"
    );
    error.cause = wasiBindingError;
    throw error;
  }
}

if (!nativeBinding) {
  if (loadErrors.length > 0) {
    throw new Error(
      `Cannot find native binding. ` +
        `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
        "Please try `npm i` again after removing both package-lock.json and node_modules directory.",
      {
        cause: loadErrors.reduce((err, cur) => {
          cur.cause = err;
          return cur;
        }),
      }
    );
  }
  throw new Error(`Failed to load native binding`);
}

const { QueryPlanner } = nativeBinding;
export { QueryPlanner };
