# -*- coding: utf-8 -*-

from flask import Blueprint, Flask, request, flash, render_template, url_for, session, redirect, abort, make_response, escape, flash, abort, send_file, escape, send_from_directory
from werkzeug.utils import secure_filename
from PIL import Image
import time
import sqlite3
import os


filesupload = Blueprint('filesupload', __name__, template_folder='templates')

app = Flask( 'pywallter' )
app.config.from_pyfile('config.py')


#### Variables ####################################################################################

DOSSIER_PERSO= app.config['DOSSIER_APP']

extensionimg = app.config['EXT_IMG']

DATABASE = app.config['DATABASE']

BASE_URL= app.config['BASE_URL']
##################################################################################################

@filesupload.route( '/filesupload/', methods=['GET', 'POST'])
def uploadfiles():
    if 'username' in session :
       UTILISATEUR='%s'% escape(session['username'])
       if request.method == 'POST' :
           files = request.files.getlist('fic')
           for f in files :
              if f: # On vérifie qu'un fichier a bien été envoyé
                 nom = secure_filename(f.filename)
                 if os.path.isfile(DOSSIER_PERSO + UTILISATEUR + '/files/' + nom):
                    flash(u'Fichier déjà existant, merci de spécifier un autre nom de fichier', 'error')
                 else:
                    if os.path.isfile(DOSSIER_PERSO + UTILISATEUR + '/images/' + nom):
                        flash(u'Image déjà existante, merci de spécifier un autre nom de fichier', 'error')
                    else:
                        file, ext = os.path.splitext(nom)
                        if ext in extensionimg :
                            f.save(DOSSIER_PERSO + UTILISATEUR + '/images/' + nom)
                            image=DOSSIER_PERSO + UTILISATEUR + '/images/' + nom
                            with Image.open(image) as img :
                                img.thumbnail((300,300))
                                img.save( DOSSIER_PERSO + UTILISATEUR + '/images/thumbnails/' + nom )
                            if os.path.isfile(DOSSIER_PERSO + UTILISATEUR + '/images/' + nom) :
                                if os.path.isfile(DOSSIER_PERSO + UTILISATEUR + '/images/thumbnails/' + nom):
                                    TIME=time.strftime("%A %d %B %Y %H:%M:%S")
                                    IP=request.environ['REMOTE_ADDR']
                                    CLIENT_PLATFORM=request.headers.get('User-Agent')
                                    log_file=os.path.join(DOSSIER_PERSO, UTILISATEUR, "log.txt")
                                    LOG=open(log_file, "a")
                                    LOG.write (TIME + ' - ' + IP + ' - ' + UTILISATEUR + ' - ' + CLIENT_PLATFORM + '\n' + '---> ' + nom + '\n')
                                    LOG.close()
                                    flash(u'Image envoyée et traitée avec succés', 'succes')
                                else:
                                   flash(u'Échec lors du traitement de l\'image', 'error')
                                   return redirect(url_for('filesupload.uploadfiles'))
                            else:
                                flash(u'Éches lors de l\'envoi de l\'image', 'error')
                                return redirect(url_for('filesupload.uploadfiles'))
                        else:
                            f.save(DOSSIER_PERSO + UTILISATEUR + '/files/' + nom)
                            if os.path.isfile(DOSSIER_PERSO + UTILISATEUR + '/files/' + nom) :
                                TIME=time.strftime("%A %d %B %Y %H:%M:%S")
                                IP=request.environ['REMOTE_ADDR']
                                CLIENT_PLATFORM=request.headers.get('User-Agent')
                                LOG=open("log.txt", "a") # Ouvre fichier log.txt
                                LOG.write (TIME + ' - ' + IP + ' - ' + UTILISATEUR + ' - ' + CLIENT_PLATFORM + '\n' + '---> ' + nom + '\n') # Écrit dans log
                                LOG.close() # Ferme log.txt
                                flash(u'Fichier envoyé avec succés', 'succes')
                                #return redirect(url_for('filesupload.upload'))
                            else:
                                return redirect(url_for('filesupload.uploadfiles'))
              else:
                 flash(u'Error : Vous avez oublié le fichier !', 'error')
                 return redirect(url_for('filesupload.uploadfiles'))
       resp = make_response(render_template('up_up.html', section="Upload"))
       resp.set_cookie('username', session['username'])
       return resp
    else :
        return redirect(BASE_URL, code=401)


@filesupload.route('/view/')
def list():
    if 'username' in session :
        UTILISATEUR='%s'% escape(session['username'])
        i = 0
        fichiers = os.listdir(DOSSIER_PERSO + UTILISATEUR + '/files/')
        listeFichiers = []
        if fichiers:
            for fich in fichiers:
                i += 1
                size = os.path.getsize(DOSSIER_PERSO + UTILISATEUR + '/files/' + fich) # size = taille des fichiers
                listeFichiers.append([i, fich, size]) # On implémente la listeFichiers avec le num le ficier et sa taille
            return render_template('up_list.html',
                                   section="Files",
                                   size=size,
                                   i=i,
                                   listeFichiers=listeFichiers)
        else :
            flash(u'Aucun fichier uploadé ! Redirection vers Upload', 'error')
            return redirect(url_for('filesupload.uploadfiles'))
    else :
        return redirect(BASE_URL, code=401)

@filesupload.route('/myfiles/<filename>')
def myfiles(filename):
    if 'username' in session :
        UTILISATEUR='%s' % escape(session['username'])
        return send_from_directory(
            os.path.join(DOSSIER_PERSO, UTILISATEUR, 'files'), filename )
    else :
        return redirect(BASE_URL, code=401)

@filesupload.route('/remove/<nom>')
def remove(nom):
    if 'username' in session :
        UTILISATEUR='%s' % escape(session['username'])
        nom = secure_filename(nom)
        if os.path.isfile(DOSSIER_PERSO + UTILISATEUR + '/files/' + nom): # si le fichier existe
            os.remove(DOSSIER_PERSO + UTILISATEUR + '/files/' + nom) # on le supprime
            return redirect(url_for('filesupload.list', _external=True))
        else:
            if os.path.isfile(DOSSIER_PERSO + UTILISATEUR + '/images/thumbnails/' + nom): # si le fichier existe
                os.remove(DOSSIER_PERSO + UTILISATEUR + '/images/thumbnails/' + nom) # on le supprime
                os.remove(DOSSIER_PERSO + UTILISATEUR + '/images/' + nom) # on le supprime
                return redirect(url_for('gallery'))
            else:
                flash(u'Fichier {nom} inexistant.'.format(nom=nom), 'error')
                return redirect(url_for('filesupload.list', _external=True)) # sinon on redirige vers la liste, avec un message d'erreur

    else :
       return redirect(BASE_URL, code=401)