import cookies from "js-cookie";

export const authUtils = {
	// Save access and refresh tokens
	setTokens: (accessToken: string, refreshToken: string) => {
		const cookieOptions = {
			expires: 1, // 1 day for access token
			secure: process.env.NODE_ENV === 'production',
			sameSite: 'strict' as const,
			path: '/',
		};

		const refreshCookieOptions = {
			expires: 7, // 7 days for refresh token
			secure: process.env.NODE_ENV === 'production',
			sameSite: 'strict' as const,
			path: '/',
		};

		cookies.set("access_token", accessToken, cookieOptions);
		cookies.set("refresh_token", refreshToken, refreshCookieOptions);
	},

	// Get access token
	getAccessToken: (): string | null => {
		return cookies.get("access_token") || null;
	},

	// Get refresh token
	getRefreshToken: (): string | null => {
		return cookies.get("refresh_token") || null;
	},

	// Remove both tokens
	clearTokens: () => {
		cookies.remove("access_token", { path: '/' });
		cookies.remove("refresh_token", { path: '/' });
	},

	// Check if user is authenticated
	isAuthenticated: (): boolean => {
		const accessToken = authUtils.getAccessToken();
		const refreshToken = authUtils.getRefreshToken();

		const accessValid = !!(accessToken && !authUtils.isTokenExpired(accessToken));
		const refreshValid = !!(refreshToken && !authUtils.isTokenExpired(refreshToken));

		return accessValid || refreshValid;
	},

	// Check if token is expired
	isTokenExpired: (token: string): boolean => {
		if (!token || typeof token !== 'string') {
			return true;
		}

		try {
			const parts = token.split(".");
			if (parts.length !== 3) {
				return true;
			}

			const payloadPart = parts[1];
			const base64 = payloadPart.replace(/-/g, "+").replace(/_/g, "/"); // base64url → base64
			const payload = JSON.parse(atob(base64));
			const currentTime = Math.floor(Date.now() / 1000);

			// Add 30 seconds buffer to prevent edge cases
			return payload.exp < (currentTime + 30);
		} catch {
			return true; // Treat invalid token as expired
		}
	},
};
