import boto3
import json
import os
import importlib
import base64
from logger_module.package_logger import print_log
import config


class SchemaLoad:
    @staticmethod
    def get_session():
        aws_access_key_id = config.AWS_ACCESS_KEY_ID
        aws_secret_access_key = config.AWS_SECRET_ACCESS_KEY
        session = boto3.session.Session(aws_access_key_id=aws_access_key_id,
                                        aws_secret_access_key=aws_secret_access_key)
        return session

    @classmethod
    def s3_read_file(cls, file_path):
        s3 = cls.get_session().resource('s3')
        bucket = s3.Bucket(config.AWS_BUCKET)
        data = s3.meta.client.get_object(Bucket=bucket.name, Key=file_path)
        body = data['Body'].read().decode('utf-8')
        return body

    def read_schema(self, path):
        schema = json.loads(self.s3_read_file(path))
        return schema

    @staticmethod
    def s3_check_exists(file_path):
        try:
            s3 = SchemaLoad.get_session().resource('s3')
            bucket = s3.Bucket(os.environ.get('AWS_BUCKET'))
            return s3.meta.client.head_object(Bucket=bucket.name, Key=file_path)
        except Exception as ex:
            return None


def s3_upload_service(content, file_path):
    try:
        s3 = SchemaLoad.get_session().resource('s3')
        bucket = s3.Bucket(config.AWS_BUCKET)
        obj = s3.Object(bucket.name, file_path)
        response = obj.put(Body=base64.b64decode(content))
        if response['ResponseMetadata']['HTTPStatusCode'] == 200:
            return True
    except Exception as ex:
        print_log(str(ex))
        print_log('S3 upload result: False')
        return False