from flask import Flask, render_template, request, redirect
from flask_socketio import SocketIO
import json
import os
import uuid

app = Flask(__name__)
socketio = SocketIO(app, async_mode="threading")

MENU_FILE = "menu.json"
ORDERS_FILE = "orders.json"


def load_menu():
    if os.path.exists(MENU_FILE):
        with open(MENU_FILE, "r") as f:
            return json.load(f)
    return {}


def save_menu(menu):
    with open(MENU_FILE, "w") as f:
        json.dump(menu, f, indent=4)


def load_orders():
    if os.path.exists(ORDERS_FILE):
        with open(ORDERS_FILE, "r") as f:
            return json.load(f)
    return []


def save_orders(orders):
    with open(ORDERS_FILE, "w") as f:
        json.dump(orders, f, indent=4)


menu = load_menu()
orders = load_orders()
open_status = False


@app.route("/")
def home():
    return redirect("/order")


@app.route("/order")
def order():
    return render_template("order.html", open_status=open_status, menu=menu)


@app.route("/dashboard")
def dashboard():
    return render_template("dashboard.html", orders=orders)


@app.route("/admin", methods=["GET", "POST"])
def admin():
    global open_status, menu, orders

    if request.method == "POST":
        action = request.form.get("action")

        if action == "toggle":
            open_status = not open_status

            # When cafe closes, clear all completed orders
            if not open_status:
                orders = []
                save_orders(orders)

        elif action == "add_drink":
            drink = request.form.get("drink_name")
            if drink and drink not in menu:
                menu[drink] = {"milk": [], "flavors": []}
                save_menu(menu)

    return render_template("admin.html", open_status=open_status, menu=menu)


@app.route("/submit", methods=["POST"])
def submit():
    global orders

    if not open_status:
        return "Cafe is Closed"

    order = {
        "id": str(uuid.uuid4()),
        "name": request.form.get("name"),
        "drink": request.form.get("drink"),
        "milk": request.form.get("milk"),
        "flavors": request.form.getlist("flavors"),
        "status": "active"
    }

    orders.append(order)
    save_orders(orders)
    socketio.emit("new_order", order)

    return redirect("/order")


@app.route("/complete/<order_id>", methods=["POST"])
def complete_order(order_id):
    global orders
    for order in orders:
        if order["id"] == order_id:
            order["status"] = "completed"
    save_orders(orders)
    return redirect("/dashboard")


@app.route("/clear", methods=["POST"])
def clear_orders():
    global orders
    orders = []
    save_orders(orders)
    socketio.emit("clear_orders")
    return redirect("/dashboard")


if __name__ == "__main__":
    socketio.run(
        app,
        host="0.0.0.0",
        port=5000,
        allow_unsafe_werkzeug=True
    )

