from base64 import b64decode
import logging

import boto3
import bugsnag
from botocore.config import Config
from botocore.exceptions import ClientError
from django.conf import settings

log = logging.getLogger(__name__)

logging.getLogger('boto3').setLevel(logging.WARNING)
logging.getLogger('botocore').setLevel(logging.WARNING)
logging.getLogger('nose').setLevel(logging.WARNING)


class S3Accessor:

    @classmethod
    def get_s3_client(cls):
        s3_client = boto3.client(
            's3', aws_access_key_id=settings.S3_ACCESS_KEY_ID, aws_secret_access_key=settings.S3_SECRET_ACCESS_KEY,
            config=Config(signature_version='s3v4', region_name='ap-south-1'))

        return s3_client

    @classmethod
    def get_document_download_link(cls, document_s3_path, expiry_secs):
        s3_client = S3Accessor.get_s3_client()

        try:
            response = s3_client.generate_presigned_url(
                'get_object', Params={'Bucket': settings.DOCS_S3_BUCKET, 'Key': document_s3_path}, ExpiresIn=expiry_secs)
            return 1, response
        except ClientError as e:
            bugsnag.notify(e)
            log.error(e)
            return 0, ''

    @classmethod
    def upload_file(cls, path, content):
        s3_client = S3Accessor.get_s3_client()
        try:
            response = s3_client.put_object(Bucket=settings.DOCS_S3_BUCKET, Body=b64decode(content,), Key=path)
            if response.get('ResponseMetadata').get('HTTPStatusCode') == 200:
                return True, path
        except ClientError as e:
            bugsnag.notify(e)
            log.error(e)
            return 0, ''
