from __future__ import print_function
import os
import sys
import argparse
import boto3
from botocore.exceptions import ClientError
import shutil
from shutil import make_archive
from shutil import copytree, ignore_patterns

import tempfile

def upload_to_s3(bucket, artefact, bucket_key, folder_name):
    """
    Uploads an artefact to Amazon S3
    """
    if (folder_name == 'root'):
        folder_name = ""

    if folder_name != "" :
        folder_name = folder_name+"/"
    
    try:
        client = boto3.client('s3')

    except ClientError as err:
        print("Failed to create boto3 client.\n" + str(err))
        return False
    

    try:
        working_dir = tempfile.mkdtemp()
        shutil.rmtree(working_dir)
        shutil.copytree( os.getcwd(), working_dir, ignore=ignore_patterns('*.py', '.git','*.yml'))

        client.put_object(
            Body=open( make_archive(artefact, 'zip',  working_dir ), 'rb' ),
            Bucket=bucket,
            Key=folder_name+bucket_key
        )

    except ClientError as err:
        shutil.rmtree(working_dir)
        print("Failed to upload artefact to S3.\n" + str(err))
        return False
    
    except IOError as err:
        shutil.rmtree(working_dir)
        print("Failed to access artefact in this directory.\n" + str(err))
        return False
    
    return True


def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("bucket", help="Name of the existing S3 bucket")
    parser.add_argument("artefact", help="Name of the artefact to be uploaded to S3")
    parser.add_argument("bucket_key", help="Name of the S3 Bucket key")
    parser.add_argument("folder_name", help="Specify if push to certain folder in the bucket")
    
    args = parser.parse_args()

    if not upload_to_s3(args.bucket, args.artefact, args.bucket_key, args.folder_name):
        sys.exit(1)

if __name__ == "__main__":
    main()