type LogLevel = "none" | "error" | "warn" | "info" | "debug";

interface LoggerConfig {
  level: LogLevel;
  remoteLogging?: boolean;
  remoteUrl?: string;
  sdkVersion?: string;
}

export class SDKLogger {
  private level: LogLevel;
  private remoteLogging: boolean;
  private remoteUrl?: string;
  private sdkVersion?: string;

  constructor(config: LoggerConfig) {
    this.level = config.level;
    this.remoteLogging = config.remoteLogging || false;
    this.remoteUrl = config.remoteUrl;
    this.sdkVersion = config.sdkVersion;
  }

  setLevel(level: LogLevel) {
    this.level = level;
  }

  setEnabled(enabled: boolean) {
    this.level = enabled ? this.level : "none";
  }

  setRemoteLogging(enabled: boolean) {
    this.remoteLogging = enabled;
  }

  private shouldLog(level: LogLevel): boolean {
    if (this.level === "none") return false;
    const order: LogLevel[] = ["error", "warn", "info", "debug"];
    return order.indexOf(level) <= order.indexOf(this.level);
  }

  private sendRemoteLog(level: string, ...args: any[]) {
    if (this.remoteLogging && this.remoteUrl) {
      try {
        fetch(this.remoteUrl, {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({
            level,
            message: args,
            sdkVersion: this.sdkVersion,
            timestamp: new Date().toISOString(),
          }),
        });
      } catch (e) {
        console.warn("Remote log failed:", e);
      }
    }
  }

  error(...args: any[]) {
    if (this.shouldLog("error")) {
      console.error("[SDK ERROR]", ...args);
      this.sendRemoteLog("error", ...args);
    }
  }

  warn(...args: any[]) {
    if (this.shouldLog("warn")) {
      console.warn("[SDK WARN]", ...args);
      this.sendRemoteLog("warn", ...args);
    }
  }

  info(...args: any[]) {
    if (this.shouldLog("info")) {
      console.info("[SDK INFO]", ...args);
      this.sendRemoteLog("info", ...args);
    }
  }

  debug(...args: any[]) {
    if (this.shouldLog("debug")) {
      console.debug("[SDK DEBUG]", ...args);
      this.sendRemoteLog("debug", ...args);
    }
  }
}
