import base64
import datetime
import hmac
import json
import os

from django.conf import settings
from django.core.files.storage import FileSystemStorage, default_storage
from django.utils._os import safe_join


class S3MockStorage(FileSystemStorage):
    @property
    def location(self):
        return safe_join(os.path.abspath(self.base_location), get_aws_location())

    class connection:
        class meta:
            class client:
                @staticmethod
                def generate_presigned_post(bucket_name, key, **policy):
                    policy = json.dumps(policy).encode()
                    policy_b64 = base64.b64encode(policy).decode()
                    date = datetime.datetime.now(tz=datetime.UTC).strftime(
                        "%Y%m%dT%H%M%SZ"
                    )
                    aws_id = getattr(
                        settings,
                        "AWS_ACCESS_KEY_ID",
                        "AWS_ACCESS_KEY_ID",
                    )
                    fields = {
                        "x-amz-algorithm": "AWS4-HMAC-SHA256",
                        "x-amz-date": date,
                        "x-amz-credential": aws_id,
                        "policy": policy_b64,
                        "key": key,
                    }
                    signature = hmac.new(
                        settings.SECRET_KEY.encode(),
                        policy + date.encode(),
                        "sha256",
                    ).digest()
                    signature = base64.b64encode(signature).decode()
                    return {
                        "url": "/__s3_mock__/",
                        "fields": {"x-amz-signature": signature, **fields},
                    }

    class bucket:
        name = "test-bucket"


local_dev = isinstance(default_storage, FileSystemStorage)

storage = default_storage if not local_dev else S3MockStorage()


def get_aws_location():
    return getattr(settings, "AWS_LOCATION", "")
