"use strict";
/* Socket Lib - Built with esbuild */
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var performance_exports = {};
__export(performance_exports, {
  clearPerformanceMetrics: () => clearPerformanceMetrics,
  generatePerformanceReport: () => generatePerformanceReport,
  getPerformanceMetrics: () => getPerformanceMetrics,
  getPerformanceSummary: () => getPerformanceSummary,
  measure: () => measure,
  measureSync: () => measureSync,
  perfCheckpoint: () => perfCheckpoint,
  perfTimer: () => perfTimer,
  printPerformanceSummary: () => printPerformanceSummary,
  trackMemory: () => trackMemory
});
module.exports = __toCommonJS(performance_exports);
var import_debug = require("./debug");
const performanceMetrics = [];
function isPerfEnabled() {
  return process.env["DEBUG"]?.includes("perf") || false;
}
function perfTimer(operation, metadata) {
  if (!isPerfEnabled()) {
    return () => {
    };
  }
  const start = performance.now();
  (0, import_debug.debugLog)(`[perf] [START] ${operation}`);
  return (additionalMetadata) => {
    const duration = performance.now() - start;
    const metric = {
      operation,
      // Round to 2 decimals
      duration: Math.round(duration * 100) / 100,
      timestamp: Date.now(),
      metadata: { ...metadata, ...additionalMetadata }
    };
    performanceMetrics.push(metric);
    (0, import_debug.debugLog)(`[perf] [END] ${operation} - ${metric.duration}ms`);
  };
}
async function measure(operation, fn, metadata) {
  const stop = perfTimer(operation, metadata);
  try {
    const result = await fn();
    stop({ success: true });
    const metric = performanceMetrics[performanceMetrics.length - 1];
    return { result, duration: metric?.duration || 0 };
  } catch (e) {
    stop({
      success: false,
      error: e instanceof Error ? e.message : "Unknown"
    });
    throw e;
  }
}
function measureSync(operation, fn, metadata) {
  const stop = perfTimer(operation, metadata);
  try {
    const result = fn();
    stop({ success: true });
    const metric = performanceMetrics[performanceMetrics.length - 1];
    return { result, duration: metric?.duration || 0 };
  } catch (e) {
    stop({
      success: false,
      error: e instanceof Error ? e.message : "Unknown"
    });
    throw e;
  }
}
function getPerformanceMetrics() {
  return [...performanceMetrics];
}
function clearPerformanceMetrics() {
  performanceMetrics.length = 0;
  (0, import_debug.debugLog)("[perf] Cleared performance metrics");
}
function getPerformanceSummary() {
  const summary = /* @__PURE__ */ Object.create(null);
  for (const metric of performanceMetrics) {
    const { duration, operation } = metric;
    if (!summary[operation]) {
      summary[operation] = {
        count: 0,
        total: 0,
        min: Number.POSITIVE_INFINITY,
        max: Number.NEGATIVE_INFINITY
      };
    }
    const stats = summary[operation];
    stats.count++;
    stats.total += duration;
    stats.min = Math.min(stats.min, duration);
    stats.max = Math.max(stats.max, duration);
  }
  const result = /* @__PURE__ */ Object.create(null);
  for (const { 0: operation, 1: stats } of Object.entries(summary)) {
    result[operation] = {
      count: stats.count,
      total: Math.round(stats.total * 100) / 100,
      avg: Math.round(stats.total / stats.count * 100) / 100,
      min: Math.round(stats.min * 100) / 100,
      max: Math.round(stats.max * 100) / 100
    };
  }
  return result;
}
function printPerformanceSummary() {
  if (!isPerfEnabled() || performanceMetrics.length === 0) {
    return;
  }
  const summary = getPerformanceSummary();
  const operations = Object.keys(summary).sort();
  (0, import_debug.debugLog)("[perf]\n=== Performance Summary ===");
  for (const operation of operations) {
    const stats = summary[operation];
    (0, import_debug.debugLog)(
      `[perf] ${operation}: ${stats.count} calls, avg ${stats.avg}ms (min ${stats.min}ms, max ${stats.max}ms, total ${stats.total}ms)`
    );
  }
  (0, import_debug.debugLog)("[perf] =========================\n");
}
function perfCheckpoint(checkpoint, metadata) {
  if (!isPerfEnabled()) {
    return;
  }
  const metric = {
    operation: `checkpoint:${checkpoint}`,
    duration: 0,
    timestamp: Date.now(),
    ...metadata ? { metadata } : {}
  };
  performanceMetrics.push(metric);
  (0, import_debug.debugLog)(`[perf] [CHECKPOINT] ${checkpoint}`);
}
function trackMemory(label) {
  if (!isPerfEnabled()) {
    return 0;
  }
  const usage = process.memoryUsage();
  const heapUsedMB = Math.round(usage.heapUsed / 1024 / 1024 * 100) / 100;
  (0, import_debug.debugLog)(`[perf] [MEMORY] ${label}: ${heapUsedMB}MB heap used`);
  const metric = {
    operation: `checkpoint:memory:${label}`,
    duration: 0,
    timestamp: Date.now(),
    metadata: {
      heapUsed: heapUsedMB,
      heapTotal: Math.round(usage.heapTotal / 1024 / 1024 * 100) / 100,
      external: Math.round(usage.external / 1024 / 1024 * 100) / 100
    }
  };
  performanceMetrics.push(metric);
  return heapUsedMB;
}
function generatePerformanceReport() {
  if (!isPerfEnabled() || performanceMetrics.length === 0) {
    return "(no performance data collected - enable with DEBUG=perf)";
  }
  const summary = getPerformanceSummary();
  const operations = Object.keys(summary).sort();
  let report = "\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n";
  report += "\u2551         Performance Report                    \u2551\n";
  report += "\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\n\n";
  for (const operation of operations) {
    const stats = summary[operation];
    report += `${operation}:
`;
    report += `  Calls: ${stats.count}
`;
    report += `  Avg:   ${stats.avg}ms
`;
    report += `  Min:   ${stats.min}ms
`;
    report += `  Max:   ${stats.max}ms
`;
    report += `  Total: ${stats.total}ms

`;
  }
  const totalDuration = Object.values(summary).reduce(
    (sum, s) => sum + s.total,
    0
  );
  report += `Total measured time: ${Math.round(totalDuration * 100) / 100}ms
`;
  return report;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
  clearPerformanceMetrics,
  generatePerformanceReport,
  getPerformanceMetrics,
  getPerformanceSummary,
  measure,
  measureSync,
  perfCheckpoint,
  perfTimer,
  printPerformanceSummary,
  trackMemory
});
