import Router, {Request, Response} from 'express';
import {createTokenByCode, getUser} from "../../controller/discord";
import {User} from "../../models/User";
import {Token} from "../../models/Token";

const app = Router();

app.post("/create", async (req: Request, res: Response) => {
    // Check if a code has been provided
    if (!req.body.code) return res.status(400).json({message: "You need to provide a code"});

    // Check if the provided token is valid
    const token = await createTokenByCode(req.body.code).catch(() => undefined);
    if (!token) return res.status(400).json({message: "The provided token is wrong"});

    // Check if all scopes have been provided
    const scopes = token.scope.split(" ");
    if (!(scopes.includes("identify") && scopes.includes("guilds"))) return res.status(400).json({message: "The provided token is wrong"});

    // Get user data
    const userData = await getUser(token.access_token).catch(() => undefined);
    if (!userData) return res.status(400).json({message: "The provided token is wrong"});

    await User.upsert({
        clientId: parseInt(userData.id), avatarId: userData.avatar === null ? undefined : userData.avatar,
        locale: userData.locale, accessToken: token.access_token, refreshToken: token.refresh_token,
        refreshDate: new Date(Date.now() + token.expires_in), username: userData.username
    });

    // Create token
    const appToken = await Token.create({clientId: parseInt(userData.id), userAgent: req.headers['user-agent']});

    // Return token
    res.json({token: appToken.token});
});

// TODO: Route to delete a session & list all current sessions

module.exports = app;