/**
 * ClerkService — Clerk authentication context for the Babel standalone prototype.
 *
 * Follows the official Clerk <script> tag pattern:
 *   - UI bundle + clerk-js loaded via two <script defer> tags in index.html
 *   - clerk-js auto-initialises from data-clerk-publishable-key attribute
 *   - This module calls Clerk.load({ ui }) once React mounts, then syncs state
 *
 * Gated by the SUBSCRIPTIONS feature flag — when disabled the provider
 * renders children immediately with isSignedIn=false and no Clerk calls.
 *
 * API (useClerkAuth):
 *   isLoaded    (bool)   — Clerk SDK has initialised
 *   isSignedIn  (bool)   — user has an active session
 *   user        (object) — Clerk user object or null
 *   openSignIn  (func)   — opens Clerk hosted sign-in modal
 *   openSignUp  (func)   — opens Clerk hosted sign-up modal
 *   signOut     (func)   — signs the user out
 */

var _createContext_CK = React.createContext;
var _useState_CK      = React.useState;
var _useEffect_CK     = React.useEffect;
var _useContext_CK    = React.useContext;
var _useCallback_CK   = React.useCallback;
var _useRef_CK        = React.useRef;

var ClerkContext = _createContext_CK({
    isLoaded:   false,
    isSignedIn: false,
    user:       null,
    openSignIn: function () {},
    openSignUp: function () {},
    signOut:    function () {},
});

var ClerkProvider = function (props) {
    var children = props.children;
    var subscriptionsEnabled = useFeatureFlag('SUBSCRIPTIONS');

    var loadedState   = _useState_CK(false);
    var isLoaded      = loadedState[0];
    var setIsLoaded   = loadedState[1];

    var signedInState = _useState_CK(false);
    var isSignedIn    = signedInState[0];
    var setIsSignedIn = signedInState[1];

    var userState = _useState_CK(null);
    var user      = userState[0];
    var setUser   = userState[1];

    var clerkRef = _useRef_CK(null);

    var syncState = _useCallback_CK(function () {
        var clerk = clerkRef.current;
        if (!clerk) return;
        setIsSignedIn(!!(clerk.session && clerk.user));
        setUser(clerk.user || null);
    }, []);

    _useEffect_CK(function () {
        if (!subscriptionsEnabled) {
            setIsLoaded(true);
            return;
        }

        // Clerk is loaded via <script defer> in index.html.
        // By the time React mounts (after DOMContentLoaded), window.Clerk is available.
        // clerk-js v6 auto-initialises from data-clerk-publishable-key — window.Clerk
        // is already a live instance, not a constructor. Just call .load().
        if (!window.Clerk) {
            console.error('[ClerkService] window.Clerk not found. Check that the Clerk <script> tags are in index.html.');
            setIsLoaded(true);
            return;
        }

        window.Clerk.load({
            ui: { ClerkUI: window.__internal_ClerkUICtor },
        })
        .then(function () {
            clerkRef.current = window.Clerk;
            syncState();
            setIsLoaded(true);
            window.Clerk.addListener(function () { syncState(); });
        })
        ['catch'](function (err) {
            console.error('[ClerkService] Clerk.load() failed:', err);
            setIsLoaded(true);
        });
    }, [subscriptionsEnabled, syncState]);

    var openSignIn = _useCallback_CK(function () {
        if (window.Clerk && subscriptionsEnabled) {
            window.Clerk.openSignIn({});
        }
    }, [subscriptionsEnabled]);

    var openSignUp = _useCallback_CK(function () {
        if (window.Clerk && subscriptionsEnabled) {
            window.Clerk.openSignUp({});
        }
    }, [subscriptionsEnabled]);

    var signOut = _useCallback_CK(function () {
        if (window.Clerk && subscriptionsEnabled) {
            window.Clerk.signOut().then(function () {
                setIsSignedIn(false);
                setUser(null);
            })['catch'](function (err) {
                console.error('[ClerkService] signOut() failed:', err);
            });
        }
    }, [subscriptionsEnabled]);

    var value = {
        isLoaded:   isLoaded,
        isSignedIn: isSignedIn,
        user:       user,
        openSignIn: openSignIn,
        openSignUp: openSignUp,
        signOut:    signOut,
    };

    return (
        <ClerkContext.Provider value={value}>
            {children}
        </ClerkContext.Provider>
    );
};

var useClerkAuth = function () {
    return _useContext_CK(ClerkContext);
};

window.ClerkProvider = ClerkProvider;
window.useClerkAuth  = useClerkAuth;
