import express from "express";
import { getLogin } from "../auth";
import { createPizzaDay, deletePizzaDay, getPizzaList, addPizzaOrder, removePizzaOrder, lockPizzaDay, unlockPizzaDay, finishPizzaOrder, finishPizzaDelivery, updatePizzaDayNote, updatePizzaFee } from "../pizza";
import { parseToken } from "../utils";
import { getWebsocket } from "../websocket";
import { addVolatileData } from "../service";

const router = express.Router();

/** Založí pizza day pro aktuální den, za předpokladu že dosud neexistuje. */
router.post("/create", async (req, res) => {
    const login = getLogin(parseToken(req));
    const data = await createPizzaDay(login);
    res.status(200).json(data);
    getWebsocket().emit("message", await addVolatileData(data));
});

/** Smaže pizza day pro aktuální den, za předpokladu že existuje. */
router.post("/delete", async (req, res) => {
    const login = getLogin(parseToken(req));
    const data = await deletePizzaDay(login);
    getWebsocket().emit("message", await addVolatileData(data));
});

router.post("/add", async (req, res) => {
    const login = getLogin(parseToken(req));
    if (isNaN(req.body?.pizzaIndex)) {
        throw Error("Nebyl předán index pizzy");
    }
    const pizzaIndex = req.body.pizzaIndex;
    if (isNaN(req.body?.pizzaSizeIndex)) {
        throw Error("Nebyl předán index velikosti pizzy");
    }
    const pizzaSizeIndex = req.body.pizzaSizeIndex;
    let pizzy = await getPizzaList();
    if (!pizzy) {
        throw Error("Selhalo získání seznamu dostupných pizz.");
    }
    if (!pizzy[pizzaIndex]) {
        throw Error("Neplatný index pizzy: " + pizzaIndex);
    }
    if (!pizzy[pizzaIndex].sizes[pizzaSizeIndex]) {
        throw Error("Neplatný index velikosti pizzy: " + pizzaSizeIndex);
    }
    const data = await addPizzaOrder(login, pizzy[pizzaIndex], pizzy[pizzaIndex].sizes[pizzaSizeIndex]);
    getWebsocket().emit("message", await addVolatileData(data));
    res.status(200).json({});
});

router.post("/remove", async (req, res) => {
    const login = getLogin(parseToken(req));
    if (!req.body?.pizzaOrder) {
        throw Error("Nebyla předána objednávka");
    }
    const data = await removePizzaOrder(login, req.body?.pizzaOrder);
    getWebsocket().emit("message", await addVolatileData(data));
    res.status(200).json({});
});

router.post("/lock", async (req, res) => {
    const login = getLogin(parseToken(req));
    const data = await lockPizzaDay(login);
    getWebsocket().emit("message", await addVolatileData(data));
    res.status(200).json({});
});

router.post("/unlock", async (req, res) => {
    const login = getLogin(parseToken(req));
    const data = await unlockPizzaDay(login);
    getWebsocket().emit("message", await addVolatileData(data));
    res.status(200).json({});
});

router.post("/finishOrder", async (req, res) => {
    const login = getLogin(parseToken(req));
    const data = await finishPizzaOrder(login);
    getWebsocket().emit("message", await addVolatileData(data));
    res.status(200).json({});
});

router.post("/finishDelivery", async (req, res) => {
    const login = getLogin(parseToken(req));
    const data = await finishPizzaDelivery(login, req.body.bankAccount, req.body.bankAccountHolder);
    getWebsocket().emit("message", await addVolatileData(data));
    res.status(200).json({});
});

router.post("/updatePizzaDayNote", async (req, res, next) => {
    const login = getLogin(parseToken(req));
    try {
        if (req.body.note && req.body.note.length > 70) {
            throw Error("Poznámka může mít maximálně 70 znaků");
        }
        const data = await updatePizzaDayNote(login, req.body.note);
        getWebsocket().emit("message", await addVolatileData(data));
        res.status(200).json(data);
    } catch (e: any) { next(e) }
});

router.post("/updatePizzaFee", async (req, res, next) => {
    const login = getLogin(parseToken(req));
    if (!req.body.login) {
        return res.status(400).json({ error: "Nebyl předán login cílového uživatele" });
    }
    try {
        const data = await updatePizzaFee(login, req.body.login, req.body.text, req.body.price);
        getWebsocket().emit("message", await addVolatileData(data));
        res.status(200).json(data);
    } catch (e: any) { next(e) }
});

export default router;