// classes.smartbucket.ts

import * as plugins from './plugins.js';
import { Bucket } from './classes.bucket.js';

export class SmartBucket {
  public config: plugins.tsclass.storage.IS3Descriptor;

  public s3Client: plugins.s3.S3Client;

  /**
   * the constructor of SmartBucket
   */
  /**
   * the constructor of SmartBucket
   */
  constructor(configArg: plugins.tsclass.storage.IS3Descriptor) {
    this.config = configArg;

    const protocol = configArg.useSsl === false ? 'http' : 'https';
    const port = configArg.port ? `:${configArg.port}` : '';
    const endpoint = `${protocol}://${configArg.endpoint}${port}`;

    this.s3Client = new plugins.s3.S3Client({
      endpoint,
      region: configArg.region || 'us-east-1',
      credentials: {
        accessKeyId: configArg.accessKey,
        secretAccessKey: configArg.accessSecret,
      },
      forcePathStyle: true, // Necessary for S3-compatible storage like MinIO or Wasabi
    });
  }

  public async createBucket(bucketNameArg: string) {
    const bucket = await Bucket.createBucketByName(this, bucketNameArg);
    return bucket;
  }

  public async removeBucket(bucketName: string) {
    await Bucket.removeBucketByName(this, bucketName);
  }

  public async getBucketByName(bucketNameArg: string) {
    return Bucket.getBucketByName(this, bucketNameArg);
  }

  public async getBucketByNameStrict(...args: Parameters<SmartBucket['getBucketByName']>) {
    const bucket = await this.getBucketByName(...args);
    if (!bucket) {
      throw new Error(`Bucket ${args[0]} does not exist.`);
    }
    return bucket;
  }
}
