import * as express from "express";

import * as bodyparser from "body-parser";

import { isAuthenticated, performLogin } from "./security/auth";

const baseRouter = express.Router();
const authRouter = express.Router();

authRouter.use(bodyparser.json());
authRouter.use(async (req, res, next) => {
    if ("token" in req.body || req.get("token")) {
        const token = req.body.token || req.get("token");

        // Check if were authenticated
        const auth = await isAuthenticated(token);
        if (auth)
            next();
        else
            res.send({
                error: "401",
                data: {},
            });
    } else {
        res.send({
            error: "401",
            data: {},
        });
    }
});
authRouter.get("/class/:id/topTen", async (req, res) => {
    if (!req.params) {
        res.send({
            error: "400",
            data: {
                msg: "No class specified",
            },
        });
        return;
    }

    console.log("Stub: /auth/class/:id/topTen");
    // TODO: Implement
    res.send({
        error: "0",
        data: {
            topTen: [{
                username: "User1",
                level: 5,
                score: 200,
            }, {
                username: "User2",
                level: 4,
                score: 100,
            }],
        }
    });
});
authRouter.get("/level/:id/vocab", async (req, res) => {
    if (!req.params) {
        res.send({
            error: "400",
            data: {
                msg: "No level specified",
            },
        });
        return;
    }

    console.log("Stub: /auth/level/:id/vocab");
    // TODO: Implement
    res.send({
        error: "0",
        data: {
            vocab: [{
                german: ["Wein"],
                hint: "Worte auf '-um' sind meistens NeutrUM",
                type: 0,
                latin: {
                    grundform: "Vinum",
                    genitiv: "Vini",
                    genus: "Neutrum"
                },
                id: 0
            }],
        }
    });
});

const app = express();
app.use(bodyparser.json());

app.use((req, res, next) => {
    // TODO: Change this to our domain
    res.append("Access-Control-Allow-Origin", "*");
    res.append("Access-Control-Allow-Headers", "Content-Type,Token");

    if (res.method === "OPTIONS") {
        // TODO: Send 200
        res.end();
    } else {
        next();
    }
});
app.use("/auth", authRouter);
app.get("/health", (req, res) => {
    res.send({
        error: "0",
        data: {
            msg: "lol",
        },
    });
});
app.post("/login", async (req, res) => {
    const { body } = req;

    console.log("Stub: /login");

    // Check if all arguments were sent
    if (!body || !body.hasOwnProperty("username") || !body.hasOwnProperty("hash")) {
        res.send({
            error: "400",
            data: {
                msg: "Username or password not specified",
            },
        });

        return;
    }

    // Try to log the user in
    const userData = await performLogin(body.username, body.hash)
        .catch((err) => {
            // If anything was wrong, just tell the client
            res.send({
                error: "1",
                data: {
                    msg: "Username or password is wrong",
                },
            });
        });

    res.send({
        error: "0",
        data: userData,
    });
});
app.listen(8080, () => {
    console.log("Starting on port 8080");
});
