import AWSCloudStorageService from "../services/AWSCloudStorageService";
import AzureCloudStorageService from "../services/AzureCloudStorageService";
import { CLOUD_PROVIDERS } from "../constants/CloudProviders";
import { CloudStorageConstructor } from "../models/CloudStorageService.models";

class ClassStorageRegistry {
  private registry: Map<string, CloudStorageConstructor>;

  constructor() {
    this.registry = new Map();
  }

  registerCloudStorage(key: string, CloudStorageClass: any): void {
    this.registry.set(key, CloudStorageClass);

    return;
  }

  getCloudStorageClass(key: string): any {
    const CloudStorageClass = this.registry.get(key);

    if (!CloudStorageClass) {
      throw new Error(`Configuration does not exist for: ${key}`);
    }

    return CloudStorageClass;
  }
}

const cloudStorageRegistry = new ClassStorageRegistry();

cloudStorageRegistry.registerCloudStorage(
  CLOUD_PROVIDERS.AWS,
  AWSCloudStorageService
);

cloudStorageRegistry.registerCloudStorage(
  CLOUD_PROVIDERS.AZURE,
  AzureCloudStorageService
);

export default cloudStorageRegistry;
