/**
 * TypeScript definitions for MeshedMonitor JavaScript SDK
 */

export interface MeshedMonitorConfig {
  apiKey?: string;
  apiUrl?: string;
  projectId?: string;
  environment?: string;
  debug?: boolean;
  batchSize?: number;
  batchTimeout?: number;
  maxRetries?: number;
  retryDelay?: number;
  enableBackgroundSync?: boolean;
}

export interface User {
  id: string;
  email?: string;
  name?: string;
  [key: string]: any;
}

export interface LogMetadata {
  source?: string;
  tags?: Record<string, any>;
  spanId?: string;
  duration?: number;
  [key: string]: any;
}

export type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';

export interface Transaction {
  id: string;
  startSpan(name: string): Span;
  setTag(key: string, value: any): Transaction;
  finish(): void;
}

export interface Span {
  id: string;
  setTag(key: string, value: any): Span;
  finish(): void;
}

export interface RequestContext {
  requestId: string;
  traceId: string;
  log(message: string, level?: LogLevel, metadata?: LogMetadata): void;
  startTransaction(name: string): Transaction;
}

declare global {
  namespace Express {
    interface Request {
      meshedMonitor?: RequestContext;
    }
  }
}

export default class MeshedMonitorSDK {
  constructor(config?: MeshedMonitorConfig);

  // Configuration & Context
  setUser(user: User): MeshedMonitorSDK;
  setTag(key: string, value: any): MeshedMonitorSDK;
  setTags(tags: Record<string, any>): MeshedMonitorSDK;
  setRelease(version: string): MeshedMonitorSDK;
  setRequestContext(requestId: string, traceId?: string): MeshedMonitorSDK;
  clearContext(): MeshedMonitorSDK;

  // Logging Methods
  log(message: string, level?: LogLevel, metadata?: LogMetadata): MeshedMonitorSDK;
  debug(message: string, metadata?: LogMetadata): MeshedMonitorSDK;
  info(message: string, metadata?: LogMetadata): MeshedMonitorSDK;
  warn(message: string, metadata?: LogMetadata): MeshedMonitorSDK;
  error(message: string, metadata?: LogMetadata): MeshedMonitorSDK;
  captureError(error: Error, additionalData?: Record<string, any>): MeshedMonitorSDK;

  // Performance Tracking
  startTransaction(name: string, operation?: string): Transaction;
  startSpan(name: string, transactionId?: string, operation?: string): Span;
  finishSpan(spanId: string): void;
  finishTransaction(transactionId: string): void;

  // Middleware
  expressMiddleware(): (req: any, res: any, next: any) => void;

  // Utilities
  wrap<T extends (...args: any[]) => any>(fn: T, name?: string): T;
  healthCheck(): Promise<boolean>;

  // Lifecycle
  flush(): Promise<void>;
  destroy(): void;
}