from flask import Flask, jsonify, render_template, url_for, request, redirect, json, make_response
from datetime import datetime, timedelta


import pymysql, os, math, requests, uuid


# File imports
from routes.v1 import app
from routes.v1 import db
from routes.v1 import cache, clearCache

from databases.volunteers import Volunteers
from databases.programs import Programs, Images
from databases.applications import Applications, ApplicationFiles
from werkzeug.utils import secure_filename
from .variables import *

from ftplib import FTP

import boto3, botocore
import boto
from boto.s3.key import Key
from botocore.client import Config

def close(self):
	self.session.close()

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']


# Pass in the application @public_id
@app.route('/file/upload/<public_id>', methods=['POST'])
def upload_file_application(public_id):
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            responseObject = {'message': 'No file part'}
            return make_response(jsonify(responseObject)), 200
        file = request.files['file']
        # if user does not select file, browser also
        # submit a empty part without filename
        if file.filename == '':
            responseObject = {'message': 'No file Selected'}
            return make_response(jsonify(responseObject)), 200
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file_name = filename.rsplit('.', 1)[0].lower()
            extension = filename.rsplit('.', 1)[1].lower()
            newfile = file_name + str(uuid.uuid4())[:8] +'.'+ extension
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], newfile))
            path = app.config['UPLOAD_FOLDER'] + newfile

            try:
                ACCESS_KEY_ID = app.config['S3_ACCESS_KEY']
                ACCESS_SECRET_KEY = app.config['S3_SECRET_KEY']
                BUCKET_NAME = app.config['S3_BUCKET']
                FILE_NAME = path

                data = open(FILE_NAME, 'rb')

                # S3 Connect
                s3 = boto3.resource(
                    's3',
                    aws_access_key_id=ACCESS_KEY_ID,
                    aws_secret_access_key=ACCESS_SECRET_KEY,
                    config=Config(signature_version='s3v4')
                )

                # Image Uploaded
                s3.Bucket(BUCKET_NAME).put_object(Key=FILE_NAME, Body=data, ACL='public-read')

                application = db.session.query(Applications).filter_by(public_id=public_id).filter(Applications.deletion_marker == None).first()

                if not application:
                    responseObject = {
                        'message' : 'Application does not exist'
                    }
                    return make_response(jsonify(responseObject)), 201

                new_file_upload = ApplicationFiles(
                    public_id = str(uuid.uuid4()),
                    application_id = public_id,
                    url =  'https://s3.ca-central-1.amazonaws.com/{0}/images/volunteers/{1}'.format(app.config['S3_BUCKET'], newfile),
                    description = request.json['description'],
                    created_at = datetime.now()
                )

                # application.image = 'https://s3.ca-central-1.amazonaws.com/{0}/images/volunteers/{1}'.format(app.config['S3_BUCKET'], newfile)

                try:
                    db.session.commit()
                    close(db)
                    clearCache()
                    responseObject = {
                        'message' : 'Successfully uploaded'
                    }
                    return make_response(jsonify(responseObject)), 200
                except Exception as identifier:
                    db.session.rollback()
                    close(db)
                    responseObject = {
                        'message' : str(identifier)
                    }
                    return make_response(jsonify(responseObject)), 500
            except Exception as identifier:
                responseObject = {
                    'error' : str(identifier),
                    'message' : 'Could not upload image to remove server'
                }
                return make_response(jsonify(responseObject)), 500