import { resolveAppLaunchDestination } from './platform/core/navigation/appLaunch';
import React, { useMemo } from 'react';
import { Navigate, useLocation } from 'react-router-dom';
import { CrmDashboardPage, CrmDashboardRoute, crmDashboardWidgets } from './dashboard-route';
import { CrmDashboardWidgetInspector } from './dashboard-widget-inspector';
import { createCrmObjectViewRouteCapabilities } from './object-view-route-capabilities';
import type { CrmFrontendRouteComponentKey } from './route-surface-policy';
import type { CrmSetupComponentName } from './setup-navigation-policy';
import { tryBuildAppNavigationPath } from './platform/core/navigation/appNavigationCapabilities';
import { useApp } from '@nexuscrm/host-sdk';

type CrmRuntimeComponent = React.ComponentType<any>;

export interface CrmRuntimeRouteBindingHost<TSetupComponent extends CrmRuntimeComponent = CrmRuntimeComponent> {
  setupComponent: TSetupComponent;
}

export interface CrmRuntimeRouteBindings<TSetupComponent extends CrmRuntimeComponent = CrmRuntimeComponent> {
  routeComponents: Partial<Record<CrmFrontendRouteComponentKey, CrmRuntimeComponent>>;
  setupComponents: Record<CrmSetupComponentName, CrmRuntimeComponent | TSetupComponent>;
}

const ObjectViewPage = React.lazy(() => import('./platform/pages/ObjectView').then(m => ({ default: m.ObjectView })));
const CrmReportBuilderPage = React.lazy(() => import('./analytics-route').then(m => ({ default: m.CrmReportBuilderPage })));
const CrmApprovalQueue = React.lazy(() => import('./approval-queue-route').then(m => ({ default: m.CrmApprovalQueue })));
const CrmVisualFlowBuilder = React.lazy(() => import('./automation-routes').then(m => ({ default: m.CrmVisualFlowBuilder })));
const CrmFlowsPage = React.lazy(() => import('./automation-routes').then(m => ({ default: m.CrmFlowsPage })));
const CrmFlowDetailPage = React.lazy(() => import('./automation-routes').then(m => ({ default: m.CrmFlowDetailPage })));
const CrmApprovalProcessSetup = React.lazy(() => import('./automation-routes').then(m => ({ default: m.CrmApprovalProcessSetup })));
const CrmApprovalProcessDetailPage = React.lazy(() => import('./automation-routes').then(m => ({ default: m.CrmApprovalProcessDetailPage })));
const CrmApprovalProcessSetupWizard = React.lazy(() => import('./automation-routes').then(m => ({ default: m.CrmApprovalProcessSetupWizard })));
const AppStudioPage = React.lazy(() => import('./platform/pages/AppStudio').then(m => ({ default: m.AppStudio })));
const RecycleBin = React.lazy(() => import('./platform/pages/RecycleBin').then(m => ({ default: m.RecycleBin })));
const Chatter = React.lazy(() => import('./platform/pages/Chatter').then(m => ({ default: m.Chatter })));
const SearchResultsPage = React.lazy(() => import('./platform/pages/SearchResultsPage').then(m => ({ default: m.SearchResultsPage })));
const ObjectManager = React.lazy(() => import('./platform/pages/ObjectManager').then(m => ({ default: m.ObjectManager })));
const UserManager = React.lazy(() => import('./platform/pages/UserManager').then(m => ({ default: m.UserManager })));
const AppManager = React.lazy(() => import('./platform/pages/AppManager').then(m => ({ default: m.AppManager })));
const LayoutManager = React.lazy(() => import('./platform/features/admin/components/layout/LayoutManager').then(m => ({ default: m.LayoutManager })));
const LayoutEditor = React.lazy(() => import('./platform/features/admin/components/LayoutEditor').then(m => ({ default: m.LayoutEditor })));
const PermissionSetManager = React.lazy(() => import('./platform/pages/PermissionSetManager').then(m => ({ default: m.PermissionSetManager })));
const GroupManager = React.lazy(() => import('./platform/pages/GroupManager').then(m => ({ default: m.GroupManager })));
const SharingRuleManager = React.lazy(() => import('./platform/pages/SharingRuleManager').then(m => ({ default: m.SharingRuleManager })));
const LayoutSelection = React.lazy(() => import('./platform/pages/LayoutSelection').then(m => ({ default: m.LayoutSelection })));
const ObjectDetail = React.lazy(() => import('./platform/pages/ObjectDetail').then(m => ({ default: m.ObjectDetail })));
const SchemaBuilder = React.lazy(() => import('./platform/pages/SchemaBuilder').then(m => ({ default: m.SchemaBuilder })));
const ProfileManager = React.lazy(() => import('./platform/pages/ProfileManager'));
const DataImport = React.lazy(() => import('./platform/pages/DataImport'));
const DataExport = React.lazy(() => import('./platform/pages/DataExport'));
const EmailTemplates = React.lazy(() => import('./platform/pages/EmailTemplates'));
const PermissionAnalyzer = React.lazy(() => import('./platform/pages/PermissionAnalyzer').then(m => ({ default: m.PermissionAnalyzer })));
const RoleManager = React.lazy(() => import('./platform/pages/RoleManager').then(m => ({ default: m.RoleManager })));
const ConnectedAppManager = React.lazy(() => import('./platform/pages/ConnectedAppManager').then(m => ({ default: m.ConnectedAppManager })));
const ConnectedAppDetailPage = React.lazy(() => import('./platform/features/connected-apps/ConnectedAppDetailPage').then(m => ({ default: m.ConnectedAppDetailPage })));
const FolderShareManager = React.lazy(() => import('./platform/pages/FolderShareManager').then(m => ({ default: m.FolderShareManager })));
const AiIntegrationHelp = React.lazy(() => import('./platform/pages/AiIntegrationHelp').then(m => ({ default: m.AiIntegrationHelp })));
const ApiTokensPage = React.lazy(() => import('./platform/pages/ApiTokensPage').then(m => ({ default: m.ApiTokensPage })));
const ConnectionsPage = React.lazy(() => import('./platform/pages/ConnectionsPage').then(m => ({ default: m.ConnectionsPage })));

const crmObjectViewRouteCapabilities = createCrmObjectViewRouteCapabilities({
  buildAppNavigationPath: tryBuildAppNavigationPath,
});

function CRMDashboardRoute() {
  return <CrmDashboardRoute />;
}

function CRMObjectViewRoute() {
  return (
    <ObjectViewPage
      objectRouteCapabilities={crmObjectViewRouteCapabilities}
    />
  );
}

function CRMAppStudioRoute() {
  return (
    <AppStudioPage
      dashboardWidgets={crmDashboardWidgets}
      renderDashboardWidgetInspector={CrmDashboardWidgetInspector}
    />
  );
}

function CRMAppHomeRedirectRoute() {
  const { currentApp, currentFrontendAppId, loading } = useApp();
  const location = useLocation();

  const destination = useMemo(() => {
    if (loading || !currentApp) return null;
    if (location.pathname !== '/') return null;

    return resolveAppLaunchDestination(currentApp, currentFrontendAppId);
  }, [currentApp, currentFrontendAppId, loading, location.pathname]);

  if (loading) {
    return <div className="p-8 text-center text-slate-500">Loading app...</div>;
  }

  if (destination?.kind === 'document') {
    return <a href={destination.href} target="_blank" rel="noopener noreferrer">Open application</a>;
  }

  if (destination && destination.href !== '/') {
    return <Navigate to={destination.href} replace />;
  }

  if (!destination) {
    return <div role="status" className="p-8 text-center text-slate-500">No accessible navigation is available for this application.</div>;
  }

  return <CrmDashboardPage />;
}

const Dashboard: CrmRuntimeComponent = (props) => (
  <CrmDashboardPage {...props} />
);

const ObjectView: CrmRuntimeComponent = (props) => (
  <ObjectViewPage
    {...props}
    objectRouteCapabilities={crmObjectViewRouteCapabilities}
  />
);

export function createCrmRuntimeRouteBindings<TSetupComponent extends CrmRuntimeComponent>(
  host: CrmRuntimeRouteBindingHost<TSetupComponent>,
): CrmRuntimeRouteBindings<TSetupComponent> {
  return {
    routeComponents: {
      appStudio: CRMAppStudioRoute,
      visualFlowBuilder: CrmVisualFlowBuilder,
      appHomeRedirect: CRMAppHomeRedirectRoute,
      dashboard: CRMDashboardRoute,
      reportBuilder: CrmReportBuilderPage,
      searchResults: SearchResultsPage,
      objectView: CRMObjectViewRoute,
      setup: host.setupComponent,
      recycleBin: RecycleBin,
      chatter: Chatter,
      approvalQueue: CrmApprovalQueue,
      aiIntegrationHelp: AiIntegrationHelp,
      apiTokens: ApiTokensPage,
      connections: ConnectionsPage,
    },
    setupComponents: {
      Dashboard,
      ObjectView,
      Flows: CrmFlowsPage,
      FlowsPage: CrmFlowsPage,
      FlowDetailPage: CrmFlowDetailPage,
      ObjectManager,
      AppManager,
      UserManager,
      LayoutManager,
      LayoutEditor,
      PermissionSetManager,
      GroupManager,
      SharingRuleManager,
      RecycleBin,
      LayoutSelection,
      ObjectDetail,
      ProfileManager,
      DataImport,
      DataExport,
      EmailTemplates,
      SchemaBuilder,
      PermissionAnalyzer,
      RoleManager,
      ApprovalProcessManager: CrmApprovalProcessSetup,
      ApprovalProcessDetailPage: CrmApprovalProcessDetailPage,
      ApprovalProcessSetupWizard: CrmApprovalProcessSetupWizard,
      ConnectedAppManager,
      ConnectedAppDetailPage,
      FolderShareManager,
    },
  };
}
