import sys; sys.path.append("..")
import config.AWSConfig as Config
import boto3
import json
import re

# In dieser Klasse werden die Interaktionen mit AWS S3 verwaltet, wie zum Beispiel das Hochladen von Dateien.
class S3Manager:

    # In diesem Konstruktor wird ein S3-Client erzeugt und der Bucketname aus den Konfigurationswerten hinterlegt.
    def __init__(self):
        self.s3Client = boto3.client(
            's3',
            aws_access_key_id=Config.AWS_ACCESS_KEY_ID,
            aws_secret_access_key=Config.AWS_SECRET_ACCESS_KEY,
            region_name=Config.REGION
        )

        self.bucketName = Config.BUCKET_NAME

    # In dieser Methode wird eine Datei in den konfigurierten S3-Bucket hochgeladen, wobei standardmäßig eine ACL für public-read gesetzt wird.
    def uploadFile(self, filePath, s3Key, acl="public-read"):

        # In diesem try-Block wird versucht, die Datei auf S3 hochzuladen und anschließend der öffentliche Link zurückgegeben.
        try:
            self.s3Client.upload_file(filePath, self.bucketName, s3Key, ExtraArgs={'ACL': acl})
            return self.getPublicUrl(s3Key)

        # In dieser Abzweigung wird eine Exception abgefangen, falls das Hochladen fehlschlägt, und None zurückgegeben.
        except Exception as e:
            print(f"Fehler beim Hochladen der Datei: {e}")
            return None

    # In dieser Methode wird der öffentliche URL-Link generiert, anhand des Bucketnamens und des S3-Schlüssels.
    def getPublicUrl(self, s3Key):
        return f"https://{self.bucketName}.s3.amazonaws.com/{s3Key}"
