import React from 'react';
import { initApplicationModule, useIdentity } from '@theorchard/suite-frontend';
import { Redirect } from 'react-router-dom';
import { usePPEnabledFF } from 'src/utils/features';
import { useCrudPermissions } from 'src/utils/identityPermissions';
import {
    PERMISSIONS_RESOURCE_TYPES,
    ROUTE_CATALOG,
    ROUTE_CREATE_PERFORMANCE,
    ROUTE_SONG,
} from './constants';
import { typePolicies } from './data';
import CatalogPage from './pages/catalogPage';
import CreatePage from './pages/createPage';
import SongPage from './pages/songPage';
import './styles';

export const useHasPermission = () => {
    const { id } = useIdentity();
    const isPPEnabled = usePPEnabledFF();
    const { checkViewPermission, checkCreatePermission } = useCrudPermissions(
        id,
        PERMISSIONS_RESOURCE_TYPES.CONTRIBUTION,
        isPPEnabled
    );

    return {
        canView: checkViewPermission(),
        canCreate: checkCreatePermission(),
    };
};

export const CatalogRedirect: React.FC = () => {
    const {
        canView: { data, loading, error },
    } = useHasPermission();
    const canViewData = !loading && !error ? data : false;

    if (loading) {
        return null;
    }

    return canViewData ? (
        <Redirect to={ROUTE_CATALOG} />
    ) : (
        <Redirect to="/catalog/sr-ownership" />
    );
};

export const CatalogEntry: React.FC = () => {
    const {
        canView: { data, loading, error },
    } = useHasPermission();
    const canViewData = !loading && !error ? data : false;

    if (loading) {
        return null;
    }

    return canViewData ? (
        <CatalogPage />
    ) : (
        <Redirect to="/catalog/sr-ownership" />
    );
};

export const CreatePerformanceRedirect: React.FC = () => {
    const {
        canCreate: { data: canCreate, loading, error },
    } = useHasPermission();
    const canCreateData = !loading && !error ? canCreate : false;

    if (loading) {
        return null;
    }

    return canCreateData ? <CreatePage /> : <Redirect to={ROUTE_CATALOG} />;
};

initApplicationModule({
    name: 'neighbouringRights',
    typePolicies,
    roles: ['manage_nr_repertoire'],
    routes: [
        {
            id: 'nrHome',
            path: '/',
            page: CatalogRedirect,
        },
        {
            id: 'nrSong',
            path: ROUTE_SONG,
            page: SongPage,
        },
        {
            id: 'nrCreate',
            path: ROUTE_CREATE_PERFORMANCE,
            page: CreatePerformanceRedirect,
        },
        {
            id: 'nrCatalog',
            path: '/catalog',
            page: CatalogRedirect,
        },
        {
            id: 'nrCatalogPage',
            path: ROUTE_CATALOG,
            page: CatalogEntry,
        },
    ],
});
