#############################################################################
#
# Autor: Gerben Dezdari
# Datum: 23.02.2024
# Beschreibung: Das Backend von einer Webseite, die das Hochladen, Anzeigen
# und Herunterladen von Dateien ermöglicht, die jedoch von einem Zeitraum von
# 1 Minute bis zu 24 Stunden wieder gelöscht werden.
#
#
#
#############################################################################
from flask import Flask, render_template, request, redirect, url_for
from flask import  send_from_directory, abort
from werkzeug.utils import secure_filename
from datetime import datetime, timedelta
import json
import os

app = Flask(__name__)

# Konfiguration des Upload-Ordners und der JSON Datei
app.config['UPLOAD_FOLDER'] = 'uploads/'
app.config['EXPIRATION_FILE'] = 'expirations.json'

# Funktion zum Löschen von abgelaufenen Dateien. Korrigiert mit Phind 
def delete_expired_files():
    try:
        with open(app.config['EXPIRATION_FILE'], 'r', encoding='utf-8') as f:
            expirations = json.load(f)
    except FileNotFoundError:
        expirations = {}

    current_time = datetime.now()
    expired_files = [filename for filename, exp_date_str in expirations.items() 
                     if datetime.fromisoformat(exp_date_str) < current_time]

    for filename in expired_files:
            os.remove(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            print(f"{filename} gelöscht, da das Ablaufdatum erreicht wurde.")

    with open(app.config['EXPIRATION_FILE'], 'w', encoding='utf-8') as f:
        json.dump(expirations, f, ensure_ascii=False)

# Hauptroute zum Hochladen und Anzeigen von Dateien Mithilfe von
@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        expiration_minutes = request.form.get('expiration_minutes', type=int)
        if file (file.filename):
            filename = secure_filename(file.filename)
            file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(file_path)

            # Ablaufzeit und Speicherung der Ablaufdaten
            if expiration_minutes is not None:
                expiration_time = datetime.now() + timedelta(minutes=expiration_minutes)
                try:
                    with open(app.config['EXPIRATION_FILE'], 'r', encoding='utf-8') as f:
                        expirations = json.load(f)
                except FileNotFoundError:
                    expirations = {}
                expirations[filename] = expiration_time.isoformat()
                with open(app.config['EXPIRATION_FILE'], 'w', encoding='utf-8') as f:
                    json.dump(expirations, f, ensure_ascii=False)

            return redirect(url_for('upload_file'))

    # Lesen der Ablaufdaten und Dateien für die Anzeige
        with open(app.config['EXPIRATION_FILE'], 'r', encoding='utf-8') as f:
            expirations = json.load(f)
    

    files_with_expirations = [(f, expirations.get(f, 'Unbekannt')) for f in os.listdir(app.config['UPLOAD_FOLDER']) if os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], f))]

    return render_template('index.html', files=files_with_expirations)

# Route zum Herunterladen von Dateien
@app.route('/uploads/<filename>')
def download_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)

# Route zu automatischen Löschen von Dateien
@app.route('/upload/<filename>')
def delete_expired_files():
    try:
        with open(app.config['EXPIRATION_FILE'], 'r', encoding='utf-8') as f:
            expirations = json.load(f)
    except FileNotFoundError:
        expirations = {}

    current_time = datetime.now()
    expired_files = [filename for filename, exp_date_str in expirations.items() if datetime.fromisoformat(exp_date_str) < current_time]

    for filename in expired_files:
        file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        if os.path.isfile(file_path):
                os.remove(file_path)


    with open(app.config['EXPIRATION_FILE'], 'w', encoding='utf-8') as f:
        json.dump(expirations, f, ensure_ascii=False)


if __name__ == "__main__":
       app.run(host='192.168.4.1')
