const TWEAK_DEFAULTS = {
    "preset": "ornate",
    "palette": "blush",
    "coupleA": "Aanya",
    "coupleB": "Rohan",
    "weddingDate": "2026-12-14",
    "venue": "Udai Bagh, Udaipur",
    "showTweaks": true
};
const PRESETS = {
    ornate: {
        label: "Romantic & Ornate",
        serif: "'Cormorant Garamond', 'Cormorant', Georgia, serif",
        sans: "'Inter Tight', system-ui, sans-serif",
        script: "'Pinyon Script', cursive",
        heroWeight: 300,
        letterSpacing: "0.02em",
        radius: "2px",
        motif: "florals",
    },
    editorial: {
        label: "Modern & Editorial",
        serif: "'Fraunces', 'Times New Roman', serif",
        sans: "'Inter Tight', system-ui, sans-serif",
        script: "'Caveat', cursive",
        heroWeight: 500,
        letterSpacing: "-0.02em",
        radius: "0px",
        motif: "geometric",
    },
    playful: {
        label: "Playful & Colorful",
        serif: "'Frank Ruhl Libre', Georgia, serif",
        sans: "'DM Sans', system-ui, sans-serif",
        script: "'Caveat', cursive",
        heroWeight: 600,
        letterSpacing: "-0.01em",
        radius: "14px",
        motif: "doodles",
    },
    festive: {
        label: "Festive & Traditional",
        serif: "'Cormorant Garamond', Georgia, serif",
        sans: "'Inter Tight', system-ui, sans-serif",
        script: "'Pinyon Script', cursive",
        heroWeight: 400,
        letterSpacing: "0.04em",
        radius: "4px",
        motif: "paisley",
    },
};
const PALETTES = {
    blush: {
        label: "Cream & Rose",
        bg: "#fbf6f1",
        surface: "#f5ebe0",
        ink: "#2a2520",
        inkSoft: "#6b5d52",
        accent: "#B5896E",
        accentSoft: "#e8d5c4",
        gold: "#A88B5C",
    },
    emerald: {
        label: "Emerald & Gold",
        bg: "#F4F1EA",
        surface: "#E8E2D2",
        ink: "#1F2A22",
        inkSoft: "#5C6B5F",
        accent: "#2F5D4A",
        accentSoft: "#C9D6CC",
        gold: "#B08A4A",
    },
    terracotta: {
        label: "Terracotta & Sand",
        bg: "#F7EFE6",
        surface: "#EDDDC9",
        ink: "#2D2018",
        inkSoft: "#75594A",
        accent: "#B85C3D",
        accentSoft: "#E6BFA5",
        gold: "#9C7A4F",
    },
    midnight: {
        label: "Midnight & Ivory",
        bg: "#F4EFE6",
        surface: "#E5DECF",
        ink: "#1A1F38",
        inkSoft: "#4A5275",
        accent: "#2E3656",
        accentSoft: "#C5C8D6",
        gold: "#B08A4A",
    },
    burgundy: {
        label: "Burgundy & Blush",
        bg: "#F9F0EC",
        surface: "#F0DCD3",
        ink: "#2C1820",
        inkSoft: "#7A4A55",
        accent: "#7C2238",
        accentSoft: "#E5C4C9",
        gold: "#A88B5C",
    },
};
function parseRoute(pathname, search = window.location.search) {
    const basePath = window.EA_APP?.basePath || '';
    if (basePath && (pathname === basePath || pathname.startsWith(basePath + '/')))
        pathname = pathname.slice(basePath.length) || '/';
    const qs = new URLSearchParams(search || "");
    const projectId = qs.get("project") || null;
    const segs = pathname.replace(/^\/|\/$/g, "").split("/").filter(Boolean);
    if (segs[0] === "p" && segs[1])
        return { view: "public", slug: segs[1], templateId: null, projectId: null };
    if (segs[0] === "templates")
        return { view: "gallery", templateId: segs[1] || null, slug: null, projectId: null };
    if (segs[0] === "dashboard")
        return { view: "dashboard", templateId: null, slug: null, projectId };
    if (segs[0] === "builder")
        return { view: "builder", templateId: segs[1] || null, slug: null, projectId };
    if (segs[0] === "admin")
        return { view: projectId ? "admin-builder" : "admin", templateId: null, slug: null, projectId };
    return { view: "home", templateId: null, slug: null, projectId: null };
}
function routeFor(view, templateId, projectId) {
    const path = window.EA_APP?.path || (value => value);
    const projectQuery = projectId ? `?project=${encodeURIComponent(projectId)}` : "";
    if (view === "gallery")
        return path(templateId ? `/templates/${templateId}` : "/templates");
    if (view === "dashboard")
        return path("/dashboard" + projectQuery);
    if (view === "builder")
        return path((templateId ? `/builder/${templateId}` : "/builder") + projectQuery);
    if (view === "admin-builder")
        return path('/admin' + projectQuery);
    if (view === "admin")
        return path('/admin');
    return path('/');
}
function App() {
    const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
    const params = new URLSearchParams(window.location.search);
    const appBaseUrl = (() => {
        try {
            const u = new URL(document.querySelector("base")?.href || window.location.href);
            u.hash = "";
            u.search = "";
            u.pathname = u.pathname.replace(/[^/]*$/, "");
            return u.href;
        }
        catch (_) {
            const base = window.location.href.split("#")[0].split("?")[0];
            return base.endsWith("/") ? base : base + "/";
        }
    })();
    const normalizeTemplateId = TemplateCatalog.normalizeId;
    const { view: pathView, templateId: pathTemplateId, slug: pathSlug, projectId: pathProjectId } = parseRoute(window.location.pathname);
    const legacyView = params.get("view") === "builder" ? "builder"
        : params.get("view") === "dashboard" ? "dashboard"
            : params.get("view") === "templates" ? "gallery"
                : null;
    const initView = pathView !== "home" ? pathView : (legacyView || "home");
    const initTemplateId = normalizeTemplateId(pathTemplateId || params.get("template"));
    const initTemplate = TemplateCatalog.get(initTemplateId);
    const initProjectId = pathProjectId || params.get("project") || null;
    const [view, setView] = React.useState(initView);
    const [selectedTemplate, setSelectedTemplate] = React.useState(initTemplate);
    const [selectedProjectId, setSelectedProjectId] = React.useState(initProjectId);
    const [adminReason, setAdminReason] = React.useState('');
    const [publicSlug, setPublicSlug] = React.useState(pathSlug);
    const availability = window.EA_TEMPLATE_AVAILABILITY;
    const [templateAccess, setTemplateAccess] = React.useState(() => availability?.getSnapshot() || { loaded: true, error: '', revision: 0 });
    React.useEffect(() => availability?.subscribe(setTemplateAccess), [availability]);
    React.useEffect(() => {
        if (!availability || view === 'public')
            return;
        const refresh = () => { availability.refresh(); };
        refresh();
        window.addEventListener('focus', refresh);
        window.addEventListener('everafter:templates-changed', refresh);
        return () => { window.removeEventListener('focus', refresh); window.removeEventListener('everafter:templates-changed', refresh); };
    }, [availability, view, selectedProjectId]);
    React.useEffect(() => {
        const onPop = () => {
            const { view: v, templateId, slug, projectId } = parseRoute(window.location.pathname);
            const tpl = TemplateCatalog.get(templateId);
            setSelectedTemplate(tpl);
            window.EA_ACTIVE_PROJECT_ID = projectId || null;
            setSelectedProjectId(projectId || null);
            setAdminReason('');
            setPublicSlug(slug || null);
            setView(v);
        };
        window.addEventListener("popstate", onPop);
        return () => window.removeEventListener("popstate", onPop);
    }, []);
    const [user, setUser] = React.useState(null);
    const [sessionStatus, setSessionStatus] = React.useState('loading');
    const [sessionError, setSessionError] = React.useState('');
    const [sessionRetry, setSessionRetry] = React.useState(0);
    const [accountVersion, setAccountVersion] = React.useState(0);
    const sessionIdentity = React.useRef(null);
    const [signInOpen, setSignInOpen] = React.useState(false);
    const [signInRedirect, setSignInRedirect] = React.useState(null);
    React.useEffect(() => {
        let active = true;
        let sessionEvents = 0;
        const apply = next => {
            if (!active)
                return;
            const identity = next?.id || null;
            if (sessionIdentity.current && sessionIdentity.current !== identity) {
                setAccountVersion(value => value + 1);
                window.EA_ACTIVE_PROJECT_ID = null;
            }
            sessionIdentity.current = identity;
            setUser(next || null);
            setSessionStatus('ready');
            setSessionError('');
        };
        setSessionStatus('loading');
        setSessionError('');
        Promise.resolve().then(() => window.EA.refreshSession()).then(data => {
            if (sessionEvents === 0)
                apply(data?.user);
        }).catch(error => {
            if (active && sessionEvents === 0) {
                setSessionStatus('error');
                setSessionError(error.message || 'Your account could not be checked. Please try again.');
            }
        });
        const update = event => { sessionEvents++; apply(event.detail?.user); };
        window.addEventListener('everafter:session', update);
        return () => { active = false; window.removeEventListener('everafter:session', update); };
    }, [sessionRetry]);
    const openSignIn = React.useCallback((redirect) => {
        setSignInRedirect(typeof redirect === "string" && ["home", "gallery", "dashboard", "builder", "admin", "admin-builder"].includes(redirect) ? redirect : null);
        setSignInOpen(true);
    }, []);
    React.useEffect(() => {
        window.everafterOpenSignIn = openSignIn;
        const onClick = (event) => {
            const trigger = event.target?.closest?.("[data-auth-action='signin']");
            if (!trigger)
                return;
            openSignIn(trigger.getAttribute("data-auth-redirect") || null);
        };
        document.addEventListener("click", onClick);
        return () => {
            document.removeEventListener("click", onClick);
            if (window.everafterOpenSignIn === openSignIn)
                delete window.everafterOpenSignIn;
        };
    }, [openSignIn]);
    const handleSignedIn = React.useCallback((u) => {
        setUser(u);
        setSignInOpen(false);
        if (signInRedirect) {
            setView(signInRedirect);
            window.history.pushState({ view: signInRedirect, templateId: selectedTemplate?.id || null, projectId: selectedProjectId || null }, "", routeFor(signInRedirect, selectedTemplate?.id || null, selectedProjectId || null));
            setSignInRedirect(null);
        }
    }, [signInRedirect, selectedTemplate, selectedProjectId]);
    const handleSignOut = React.useCallback(async () => {
        try {
            if (typeof signOut === "function")
                await signOut();
        }
        catch (error) {
            setSessionError(error.message || 'Sign out did not complete. Please try again.');
            return;
        }
        if (window.EA?.currentUser?.()) {
            setSessionError('Your account changed while signing out. Please try again.');
            return;
        }
        setUser(null);
        setView("home");
        setSelectedProjectId(null);
        window.EA_ACTIVE_PROJECT_ID = null;
        window.history.pushState({ view: "home", templateId: null, projectId: null }, "", routeFor('home'));
    }, []);
    const preset = PRESETS[t.preset] || PRESETS.ornate;
    const palette = PALETTES[t.palette] || PALETTES.blush;
    const cssVars = {
        "--font-serif": preset.serif,
        "--font-sans": preset.sans,
        "--font-script": preset.script,
        "--hero-weight": preset.heroWeight,
        "--ls-display": preset.letterSpacing,
        "--radius": preset.radius,
        "--bg": palette.bg,
        "--surface": palette.surface,
        "--ink": palette.ink,
        "--ink-soft": palette.inkSoft,
        "--accent": palette.accent,
        "--accent-soft": palette.accentSoft,
        "--gold": palette.gold,
    };
    if (view === "public" && publicSlug && typeof PublicInvite !== "undefined") {
        return React.createElement(PublicInvite, { slug: publicSlug });
    }
    const goTo = (v, opts = {}) => {
        const hasProject = Object.prototype.hasOwnProperty.call(opts, "projectId");
        const tpl = TemplateCatalog.get(opts.template?.id);
        const routeProjectId = parseRoute(window.location.pathname).projectId;
        const adminEditing = view === "admin-builder" || (view === "builder" && user?.isAdmin === true);
        const currentProjectId = adminEditing ? null : window.EA_ACTIVE_PROJECT_ID || routeProjectId || selectedProjectId || null;
        if (adminEditing)
            window.EA_ACTIVE_PROJECT_ID = null;
        const nextProjectId = hasProject ? (opts.projectId || null) : (v === "dashboard" ? currentProjectId : null);
        if (v === "builder" || tpl)
            setSelectedTemplate(tpl);
        setSelectedProjectId(nextProjectId);
        setAdminReason(typeof opts.adminReason === 'string' ? opts.adminReason : '');
        setView(v);
        const path = routeFor(v, tpl?.id || null, nextProjectId);
        window.history.pushState({ view: v, templateId: tpl?.id || null, projectId: nextProjectId }, "", path);
        window.scrollTo({ top: 0, behavior: "instant" });
    };
    const openInviteTab = (tpl) => {
        const demo = TemplateCatalog.list("demo").find((item) => item.id === tpl?.id);
        if (!demo?.demoPath)
            return;
        const url = new URL(window.EA_APP?.path ? window.EA_APP.path(demo.demoPath) : demo.demoPath, appBaseUrl);
        url.searchParams.set("demo", "1");
        window.location.assign(url.href);
    };
    const AuthModal = window.SignInModal || (typeof SignInModal !== "undefined" ? SignInModal : null);
    const needsTemplateAccess = view === 'home' || view === 'gallery' || (view === 'builder' && !selectedProjectId && user?.isAdmin !== true);
    const waitingForTemplates = needsTemplateAccess && !templateAccess.loaded;
    return (React.createElement("div", { className: "root", style: cssVars },
        React.createElement(TopNav, { view: view, goTo: goTo, preset: preset, user: user, openSignIn: openSignIn, onSignOut: handleSignOut }),
        sessionError && sessionStatus === 'ready' && React.createElement("p", { role: "alert", className: "wrap" }, sessionError),
        waitingForTemplates && React.createElement("main", { className: "section" },
            React.createElement("div", { className: "wrap" },
                React.createElement("p", { role: templateAccess.error ? 'alert' : 'status' }, templateAccess.error || 'Loading available designs…'),
                templateAccess.error && React.createElement("button", { type: "button", className: "btn btn-primary", onClick: () => availability.refresh() }, "Retry available designs"))),
        needsTemplateAccess && templateAccess.loaded && templateAccess.error && React.createElement("p", { className: "wrap", role: "alert" },
            "Availability could not be refreshed. New invitations will be checked when you save. ",
            React.createElement("button", { type: "button", className: "btn btn-ghost", onClick: () => availability.refresh() }, "Retry available designs")),
        view === "home" && !waitingForTemplates && React.createElement(Landing, { key: templateAccess.revision, goTo: goTo, openInviteTab: openInviteTab, preset: preset, palette: palette, t: t, openSignIn: openSignIn, user: user }),
        view === "gallery" && !waitingForTemplates && React.createElement(Gallery, { goTo: goTo, openInviteTab: openInviteTab, focusedTemplateId: pathTemplateId, preset: preset, palette: palette, user: user }),
        ["dashboard", "builder", "admin", "admin-builder"].includes(view) && sessionStatus !== 'ready' && React.createElement("main", { className: "section" },
            React.createElement("div", { className: "wrap" },
                React.createElement("p", { role: sessionStatus === 'error' ? 'alert' : 'status' }, sessionError || 'Opening your account…'),
                sessionStatus === 'error' && React.createElement("button", { className: "btn btn-primary", onClick: () => setSessionRetry(value => value + 1) }, "Try again"))),
        view === "dashboard" && sessionStatus === 'ready' && React.createElement(Dashboard, { key: accountVersion, goTo: goTo, t: t, user: user, onSignOut: handleSignOut, openSignIn: openSignIn, projectId: selectedProjectId }),
        view === "builder" && sessionStatus === 'ready' && !waitingForTemplates && !(user?.isAdmin === true && selectedTemplate) && React.createElement(Builder, { key: accountVersion + ":" + (selectedTemplate?.id || "choose") + ":" + (selectedProjectId || "new"), goTo: goTo, t: t, template: selectedTemplate, user: user, openSignIn: openSignIn, projectId: selectedProjectId }),
        (view === "admin-builder" || (view === "builder" && user?.isAdmin === true && selectedTemplate)) && sessionStatus === 'ready' && React.createElement(AdminBuilder, { key: accountVersion + ':' + (selectedProjectId || selectedTemplate?.id || 'new'), projectId: selectedProjectId, template: selectedTemplate, user: user, goTo: goTo, openSignIn: openSignIn, t: t, initialReason: adminReason }),
        view === "admin" && sessionStatus === 'ready' && React.createElement(Admin, { key: accountVersion, user: user, openSignIn: openSignIn, goTo: goTo }),
        AuthModal && (React.createElement(AuthModal, { open: signInOpen, onClose: () => setSignInOpen(false), onSignedIn: handleSignedIn })),
        !["dashboard", "builder", "admin", "admin-builder"].includes(view) && React.createElement(Footer, { preset: preset }),
        (params.get("edit") === "1" || params.get("tweaks") === "1") && React.createElement(TweaksPanel, { title: "Tweaks" },
            React.createElement(TweakSection, { label: "Aesthetic" }),
            React.createElement(TweakSelect, { label: "Preset", value: t.preset, options: Object.entries(PRESETS).map(([v, p]) => ({ value: v, label: p.label })), onChange: (v) => setTweak("preset", v) }),
            React.createElement(TweakSelect, { label: "Palette", value: t.palette, options: Object.entries(PALETTES).map(([v, p]) => ({ value: v, label: p.label })), onChange: (v) => setTweak("palette", v) }),
            React.createElement(TweakSection, { label: "The Couple" }),
            React.createElement(TweakText, { label: "Name A", value: t.coupleA, onChange: (v) => setTweak("coupleA", v) }),
            React.createElement(TweakText, { label: "Name B", value: t.coupleB, onChange: (v) => setTweak("coupleB", v) }),
            React.createElement(TweakText, { label: "Date", value: t.weddingDate, onChange: (v) => setTweak("weddingDate", v) }),
            React.createElement(TweakText, { label: "Venue", value: t.venue, onChange: (v) => setTweak("venue", v) }),
            React.createElement(TweakSection, { label: "Jump To" }),
            React.createElement("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 6 } },
                React.createElement(TweakButton, { label: "Home", secondary: true, onClick: () => goTo("home") }),
                React.createElement(TweakButton, { label: "Gallery", secondary: true, onClick: () => goTo("gallery") }),
                React.createElement(TweakButton, { label: "Dashboard", secondary: true, onClick: () => goTo("dashboard") }),
                React.createElement(TweakButton, { label: "Builder", secondary: true, onClick: () => goTo("builder") })))));
}
ReactDOM.createRoot(document.getElementById("root")).render(React.createElement(App, null));
