import { PlatformService } from "./PlatformService";
import { WebPlatformService } from "./platforms/WebPlatformService";
import { CapacitorPlatformService } from "./platforms/CapacitorPlatformService";
import { ElectronPlatformService } from "./platforms/ElectronPlatformService";

/**
 * Factory class for creating platform-specific service implementations.
 * Implements the Singleton pattern to ensure only one instance of PlatformService exists.
 *
 * The factory determines which platform implementation to use based on the VITE_PLATFORM
 * environment variable. Supported platforms are:
 * - capacitor: Mobile platform using Capacitor
 * - electron: Desktop platform using Electron with Capacitor
 * - web: Default web platform (fallback)
 *
 * @example
 * ```typescript
 * const platformService = PlatformServiceFactory.getInstance();
 * await platformService.takePicture();
 * ```
 */
export class PlatformServiceFactory {
  private static instance: PlatformService | null = null;
  private static callCount = 0; // Debug counter
  private static creationLogged = false; // Only log creation once

  /**
   * Gets or creates the singleton instance of PlatformService.
   * Creates the appropriate platform-specific implementation based on environment.
   *
   * @returns {PlatformService} The singleton instance of PlatformService
   */
  public static getInstance(): PlatformService {
    PlatformServiceFactory.callCount++;

    if (PlatformServiceFactory.instance) {
      // Normal case - return existing instance silently
      return PlatformServiceFactory.instance;
    }

    // Only log when actually creating the instance
    const platform = process.env.VITE_PLATFORM || "web";

    if (!PlatformServiceFactory.creationLogged) {
      // Use console for critical startup message to avoid circular dependency
      // eslint-disable-next-line no-console
      console.log(
        `[PlatformServiceFactory] Creating singleton instance for platform: ${platform}`,
      );
      PlatformServiceFactory.creationLogged = true;
    }

    switch (platform) {
      case "capacitor":
        PlatformServiceFactory.instance = new CapacitorPlatformService();
        break;
      case "electron":
        // Use a specialized electron service that extends CapacitorPlatformService
        PlatformServiceFactory.instance = new ElectronPlatformService();
        break;
      case "web":
      default:
        PlatformServiceFactory.instance = new WebPlatformService();
        break;
    }

    return PlatformServiceFactory.instance;
  }

  /**
   * Debug method to check singleton usage stats
   */
  public static getStats(): { callCount: number; instanceExists: boolean } {
    return {
      callCount: PlatformServiceFactory.callCount,
      instanceExists: PlatformServiceFactory.instance !== null,
    };
  }
}
