from flask import Flask, jsonify, request, render_template, redirect, url_for, flash
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from flask_mail import Mail, Message
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.security import gen_salt
import hmac
import os
import uuid
from datetime import datetime, timedelta
import secrets
from dotenv import load_dotenv
from msal import ConfidentialClientApplication
import requests
import dbconnection 
import mysql.connector

# geheim schlüssel
geheim_schlüssel = secrets.token_hex(16)
# Umgebungsvariablen laden
load_dotenv()

def newsletter_user(email: str):
    """Prüft, ob die E-Mail bereits in der Tabelle `newsletter` existiert.
    Falls nicht vorhanden, wird sie eingefügt.

    Rückgabe:
      - 'exists' wenn die E-Mail bereits vorhanden ist
      - 'inserted' wenn Einfügen erfolgreich war
      - 'error' bei einem Datenbankfehler
    """
    try:
        conn = dbconnection.connection
        # sicherstellen, dass die Verbindung aktiv ist
        if not conn.is_connected():
            conn.reconnect(attempts=3, delay=1)

        cursor = conn.cursor()
        # 1) prüfen, ob E-Mail vorhanden
        cursor.execute("SELECT id FROM newsletter WHERE email = %s", (email,))
        if cursor.fetchone():
            cursor.close()
            return 'exists'

        # 2) einfügen (parametrisiert)
        cursor.execute(
            "INSERT INTO newsletter (email) VALUES (%s)",
            (email,)
        )
        conn.commit()
        cursor.close()
        return 'inserted'

    except mysql.connector.Error as err:
        print(f"Datenbankfehler (newsletter): {err}")
        try:
            cursor.close()
        except Exception:
            pass
        return 'error'



# App importieren 
app = Flask(__name__)
app.config['SECRET_KEY'] = geheim_schlüssel

class User(UserMixin):
    def __init__(self,id,email):
        self.id = id
        self.email = email

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        email = request.form.get('email', '').strip()
        # einfache Validierung
        if not email or '@' not in email:
            flash('Bitte gib eine gültige E-Mail-Adresse ein.', 'error')
            return render_template('index.html')

        result = newsletter_user(email)
        if result == 'exists':
            flash('Diese E-Mail ist bereits im Newsletter-Verteiler.', 'error')
        elif result == 'inserted':
            flash('Danke — deine E-Mail wurde zum Newsletter hinzugefügt.', 'success')
        else:
            flash('Beim Speichern deiner E-Mail ist ein Fehler aufgetreten. Bitte versuche es später erneut.', 'error')
        return render_template('index.html')
    return render_template('index.html')

@app.route('/impressum')
def impressum():
    return render_template('impressum.html')

@app.route('/datenschutz')
def datenschutz():
    return render_template('datenschutz.html')

@app.route('/api/newsletter/subscribe', methods=['POST'])
def newsletter_subscribe():
    """API-Endpunkt für Newsletter-Anmeldung (z.B. aus Popup)"""
    try:
        data = request.get_json()
        if not data:
            return jsonify({'success': False, 'message': 'Keine Daten empfangen.'}), 400
        
        email = data.get('email', '').strip()
        
        if not email or '@' not in email:
            return jsonify({'success': False, 'message': 'Bitte gib eine gültige E-Mail-Adresse ein.'}), 400
        
        result = newsletter_user(email)
        if result == 'exists':
            return jsonify({'success': False, 'message': 'Diese E-Mail ist bereits im Newsletter-Verteiler.'}), 409
        elif result == 'inserted':
            return jsonify({'success': True, 'message': 'Vielen Dank für deine Anmeldung! Du erhältst in Kürze eine Bestätigungs-E-Mail.'}), 200
        else:
            return jsonify({'success': False, 'message': 'Beim Speichern deiner E-Mail ist ein Fehler aufgetreten. Bitte versuche es später erneut.'}), 500
    except Exception as e:
        print(f"Fehler in newsletter_subscribe: {e}")
        return jsonify({'success': False, 'message': 'Ein unerwarteter Fehler ist aufgetreten.'}), 500


if __name__ == '__main__':
    #app.run(host="0.0.0.0", port=8000)
    app.run(debug=True, port=8000)