import React from 'react';
import { useAppConfig } from '@theorchard/suite-frontend';
import {
    FEATURE_DEPRECATE_ANALYTICS,
    LAST_VENDOR_ID_BEFORE_ANALYTICS_DEPRECIATION,
    BRAND_AWAL,
    PERMITTED_VENDOR_IDS_AFTER_ANALYTICS_DEPRECIATION,
} from 'src/constants';
import IdentityContext from 'src/context';
import { hasAccessToRoute, collapseRoute } from 'src/utils/sitemap';
import LegacyLink from './legacy-link';
import ReactifiedLink from './reactified-link';
import type { Route } from 'src/utils/sitemap';

export const CLASSNAME_ITEM = 'navItem';

interface SitemapIdentity {
    vendorId?: number;
    hasFeatureFlag(flag: string): boolean;
    hasFeatureControl(feature: string | string[]): boolean;
}

const shouldShowAnalyticsTab = (identity: SitemapIdentity): boolean => {
    const { vendorId } = identity;
    const userIsNewerThanInsightsLaunch =
        vendorId !== undefined &&
        vendorId > LAST_VENDOR_ID_BEFORE_ANALYTICS_DEPRECIATION;
    const userHasAccessAfterInsightsLaunch =
        vendorId !== undefined &&
        PERMITTED_VENDOR_IDS_AFTER_ANALYTICS_DEPRECIATION.includes(vendorId);
    const isAnalyticsDeprecatedFeatureFlagEnabled = identity.hasFeatureFlag(
        FEATURE_DEPRECATE_ANALYTICS
    );
    const isPhysicalReportingFeatureControlEnabled = identity.hasFeatureControl(
        'Workstation Physical Reporting'
    );
    const isWorkstationAnalyticsFeatureControlEnabled =
        identity.hasFeatureControl('Workstation Analytics Overview');
    const isSourceOfStreamsFeatureControlEnabled =
        identity.hasFeatureControl('Source of Stream');
    // we have to show analytics tab for some users which were created after insights launch according to this ticket:
    // https://theorchard.atlassian.net/browse/IN-10149.
    const newUserAccessDenied =
        !userHasAccessAfterInsightsLaunch && userIsNewerThanInsightsLaunch;
    const vendorAccessDenied =
        newUserAccessDenied && !isPhysicalReportingFeatureControlEnabled;

    // see conditions table in https://theorchard.atlassian.net/browse/IN-9785
    if (vendorAccessDenied) return false;

    if (!isAnalyticsDeprecatedFeatureFlagEnabled) return true;

    if (
        !(
            isPhysicalReportingFeatureControlEnabled ||
            isWorkstationAnalyticsFeatureControlEnabled
        )
    )
        return false;
    if (
        isWorkstationAnalyticsFeatureControlEnabled &&
        !isPhysicalReportingFeatureControlEnabled &&
        !isSourceOfStreamsFeatureControlEnabled
    )
        return false;

    return true;
};

interface SitemapItemsProps {
    className: string;
    items?: Route[];
    isEmbedOnPhp?: boolean;
}

const SitemapItems: React.FC<SitemapItemsProps> = ({
    items = [],
    className,
    isEmbedOnPhp,
}) => {
    const { identity } = React.useContext(IdentityContext);
    const config = useAppConfig();

    const isAnalyticsDeprecatedFeatureFlagEnabled = identity.hasFeatureFlag(
        FEATURE_DEPRECATE_ANALYTICS
    );
    const itemProps = {
        className: `${className}-${CLASSNAME_ITEM}`,
        activeClassName: `${className}-${CLASSNAME_ITEM}-active`,
    };

    const renderLink = (page: Route) => {
        const { module, key: term, match: urlMatch } = page;
        let url = page.url!;
        const isSubHeader = (term ?? '').includes('subheader');
        const shouldChangeUrl =
            url === '/analytics/overview' || url === '/analytics/engagement';

        if (
            isAnalyticsDeprecatedFeatureFlagEnabled &&
            shouldChangeUrl &&
            !isSubHeader
        )
            url = '/analytics/splash';

        const linkProps = { ...itemProps, url, urlMatch, term: term ?? '' };
        let ItemLink = module ? ReactifiedLink : LegacyLink;

        if (
            url.includes('/analytics') &&
            isAnalyticsDeprecatedFeatureFlagEnabled
        )
            ItemLink = ReactifiedLink;

        if (isEmbedOnPhp) ItemLink = LegacyLink;

        return <ItemLink key={term} {...linkProps} />;
    };

    const hideAnalyticsTab = !shouldShowAnalyticsTab(identity);

    const linkElements = items
        .filter(item => !(hideAnalyticsTab && item.url?.includes('/analytics')))
        .filter(item => item.showInHeader !== false)
        .filter(
            item => !(config.brand === BRAND_AWAL && item.url === '/marketing2')
        )
        .map(item => collapseRoute(identity, item))
        .filter(item => item.url && hasAccessToRoute(identity, item))
        .map(page => renderLink(page));

    return <>{linkElements}</>;
};

export default SitemapItems;
