import * as plugins from './plugins.js';

// Export all base types - these are the public API
export * from '../core_base/types.js';

const smartenvInstance = new plugins.smartenv.Smartenv();

// Dynamically load the appropriate implementation based on runtime
let CoreRequest: any;
let CoreResponse: any;

if (smartenvInstance.isDeno) {
  // In Deno, load the Deno implementation with HttpClient-based unix socket support
  const impl = await import('../core_deno/index.js');
  CoreRequest = impl.CoreRequest;
  CoreResponse = impl.CoreResponse;
} else if (smartenvInstance.isBun) {
  // In Bun, load the Bun implementation with native fetch unix socket support
  const impl = await import('../core_bun/index.js');
  CoreRequest = impl.CoreRequest;
  CoreResponse = impl.CoreResponse;
} else if (smartenvInstance.isNode) {
  // In Node.js, load the Node.js implementation with native http/https unix socket support
  const modulePath = plugins.smartpath.join(
    plugins.smartpath.dirname(import.meta.url),
    '../core_node/index.js',
  );
  const impl = await smartenvInstance.getSafeNodeModule(modulePath);
  CoreRequest = impl.CoreRequest;
  CoreResponse = impl.CoreResponse;
} else {
  // In browser, load the fetch implementation (no unix socket support)
  const impl = await import('../core_fetch/index.js');
  CoreRequest = impl.CoreRequest;
  CoreResponse = impl.CoreResponse;
}

// Export the loaded implementations
export { CoreRequest, CoreResponse };
