import Webpage from "@/components/Webpage";
import { useRouter } from "next/router";
import type { GetServerSidePropsContext } from "next";
import AdditionalTools from "@/lib/AdditionalTools";
import Session from "@/components/webpage/Session/Session";
import SessionHelper from "@/lib/SessionHelper";
import { useEffect, useState } from "react";
import WsAuth from "@/lib/WsAuth";

type SessionPageProps = {
    id?: string | null;
    isValid: boolean;
    sessionStarted?: boolean;
    isPdfMode?: boolean;
};

function SessionPage({ id, isValid, sessionStarted, isPdfMode }: SessionPageProps) {
    const router = useRouter();
    const sessionId = id ?? AdditionalTools.getUrlFromQuery(router.query);
    const [canJoin, setCanJoin] = useState<boolean | null>(null);

    useEffect(() => {
        if (!sessionId || !isValid) {
            setCanJoin(false);
            return;
        }

        // Im PDF-Modus direkt erlauben (Server hat bereits Auth geprüft)
        if (isPdfMode) {
            setCanJoin(true);
            return;
        }

        if (!sessionStarted) {
            setCanJoin(true);
            return;
        }

        // Session ist gestartet - prüfe auf gültigen Token
        try {
            const storedToken = localStorage.getItem("wsClientToken");
            if (storedToken) {
                const isForSession = WsAuth.isTokenForSession(storedToken, sessionId);
                const isExpired = WsAuth.isTokenExpired(storedToken);
                if (isForSession && !isExpired) {
                    setCanJoin(true);
                    // gültig
                    return;
                }
            }
        } catch {
        }

        // nicht gültig, redict
        router.replace("/");
        setCanJoin(false);
    }, [sessionId, isValid, sessionStarted, isPdfMode, router]);

    if (!sessionId || !isValid || !canJoin || canJoin === null) {
        return null;
    }

    return (
        <Webpage>
            <Session sessionCode={sessionId} />
        </Webpage>
    );
}

// Server: read only param ?id=
async function getServerSideProps(context: GetServerSidePropsContext) {
    try {
        const id = AdditionalTools.getUrlFromQuery(context.query);
        const isPdfMode = context.query.pdf === "1";
        
        if (!id) {
            return { redirect: { destination: "/", permanent: false } };
        }

        const sessionExists = await SessionHelper.getSessionByCode(id);
        if (!sessionExists) {
            return { redirect: { destination: "/", permanent: false } };
        }

        // Nur Eintritt wenn Session noch in der Lobby ist
        const status = sessionExists.Status?.toLowerCase?.() ?? "";
        const sessionStarted = status !== "lobby";

        return { props: { id, isValid: true, sessionStarted, isPdfMode } };
    } catch (err) {
        console.error("getServerSideProps error:", err);
        return { redirect: { destination: "/", permanent: false } };
    }
}

export default SessionPage;
export { getServerSideProps };
