import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME, API_UID_COOKIE_NAME } from "#lib/constants.js";
import moment from "moment";
import { TokenData, TokenType } from "#lib/auth/types.js";
import { api } from "astro-typesafe-api/client";
import { jwtDecode } from "jwt-decode"


export async function validateAccessTokenClient() { 
	const accessToken = Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME);
	const refreshToken = Cookies.get(API_REFRESH_TOKEN_COOKIE_NAME);

	if (accessToken) {
		const { exp, typ, uid } = jwtDecode(accessToken) as TokenData

		if (exp > Date.now() && typ === TokenType.Access) {
			return true;
		} else {
			Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME);
		}
	}

	// Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen.
	// Schauen wir mal, ob wir einen Refresh Token haben.

	if (!refreshToken) {
		// Wir haben keinen Refresh Token, also müssen wir uns neu anmelden.
		Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME);
		Cookies.remove(API_REFRESH_TOKEN_COOKIE_NAME);
		Cookies.remove(API_UID_COOKIE_NAME)
		return false;
	}

	// Wir haben einen Refresh Token, also versuchen wir uns damit anzumelden.
	// Wenn das klappt, dann haben wir auch einen neuen Access Token.
	// Wenn das nicht klappt, dann müssen wir uns neu anmelden.
	try {
		const { accessToken: newAccessToken, accessTokenExpiry, refreshToken: newRefreshToken, refreshTokenExpiry } = await api.auth["access-token"].GET.fetch({
			refreshToken
		})
		

		Cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, {
			domain: `.${window.location.hostname}`,
			path: "/",
			expires: moment.unix(accessTokenExpiry).toDate()
		});
		Cookies.set(API_REFRESH_TOKEN_COOKIE_NAME, newRefreshToken, {
			domain: `.${window.location.hostname}`,
			path: "/",
			expires: moment.unix(refreshTokenExpiry).toDate()
		})
		return true;
	} catch (e) {
		Cookies.remove(API_ACCESS_TOKEN_COOKIE_NAME);
		Cookies.remove(API_REFRESH_TOKEN_COOKIE_NAME);
		Cookies.remove(API_UID_COOKIE_NAME)
		return false;
	}
}