from flask import Flask, render_template, redirect, url_for, flash, jsonify, request, Response
from unas_getorder import fetch_and_convert_orders, send_to_webhook as send_single_order
from log_handler import load_log, save_log_entry
from dotenv import load_dotenv
from datetime import datetime
import os

load_dotenv()

USERNAME = os.environ.get("DASHBOARD_USER")
PASSWORD = os.environ.get("DASHBOARD_PASS")

def check_auth(username, password):
    return username == USERNAME and password == PASSWORD

def authenticate():
    return Response(
        "Hozzáférés megtagadva.\nAutentikáció szükséges.",
        401,
        {"WWW-Authenticate": 'Basic realm="UNAS Dashboard"'}
    )

def requires_auth(f):
    from functools import wraps
    @wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            return authenticate()
        return f(*args, **kwargs)
    return decorated

app = Flask(__name__)
app.secret_key = "drtrthrt654thyrgerte54jkuykrt"

@app.route("/")
@requires_auth
def home():
    return redirect("/dashboard/")

@app.route("/dashboard/")
@requires_auth
def dashboard():
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    orders = fetch_and_convert_orders()

    sent_ids = set()
    if os.path.exists("sent_orders.txt"):
        with open("sent_orders.txt") as f:
            sent_ids = set(line.strip() for line in f)

    for o in orders:
        o["sent"] = o["order_id"] in sent_ids

    logs = load_log()
    return render_template("dashboard.html", orders=orders, last_sync=now, logs=logs)

@app.route("/send/<order_id>")
@requires_auth
def send_order(order_id):
    orders = fetch_and_convert_orders()
    target_order = next((o for o in orders if o["order_id"] == order_id), None)

    if not target_order:
        flash(f"Hiba: nem található rendelés ezzel az ID-vel: {order_id}", "danger")
        return redirect(url_for("dashboard"))

    success, status_code, response_text = send_single_order(target_order)
    save_log_entry(order_id, status_code, response_text)

    if success:
        with open("sent_orders.txt", "a") as f:
            f.write(f"{order_id}\n")
        flash(f"Sikeres küldés: {order_id} → {status_code}", "success")
    else:
        flash(f"Hiba a küldésnél: {order_id} → {status_code} – {response_text}", "danger")

    return redirect(url_for("dashboard"))

@app.route("/api/orders")
@requires_auth
def api_orders():
    orders = fetch_and_convert_orders()
    sent_ids = set()

    if os.path.exists("sent_orders.txt"):
        with open("sent_orders.txt") as f:
            sent_ids = set(line.strip() for line in f)

    logs = load_log()

    for o in orders:
        oid = o["order_id"]
        o["sent"] = oid in sent_ids
        o["log"] = logs.get(oid, None)

    return jsonify(orders)

if __name__ == "__main__":
    app.run(debug=True)
