import React, { createContext, useContext } from 'react';
import { UserIdentityContext, ApplicationUser } from './types';

export const IdentityContext = createContext<Partial<UserIdentityContext>>({});
export function useIdentity<T extends UserIdentityContext = UserIdentityContext>() {
    const { user, client } = (useContext(IdentityContext) || {});
    if (!user || !client)
        throw new Error('IdentityContext is not initialized');
    return { user, client } as T;
}

export function useUser<T extends ApplicationUser = ApplicationUser>() {
    const { user } = (useContext(IdentityContext) || {});
    return user as T;
}

// eslint-disable-next-line func-names
export const withUser = function <P>(Component: React.ComponentType<P>) {
    const InjectedWithUser = (props: P) => (
        <IdentityContext.Consumer>
            {({ user }) => <Component {...props} user={user} />}
        </IdentityContext.Consumer>
    );
    return InjectedWithUser as React.ComponentType<Omit<P, 'user'>>;
};
