import React from 'react';
import { CrmDashboardPage } from './dashboard-route';
import {
  CreateReportModal,
  ReportRecordDetail,
} from './platform/features/analytics';

export const CRM_DASHBOARD_OBJECT_API_NAME = 'dashboard';
export const CRM_REPORT_OBJECT_API_NAME = 'report';

type CrmReportRecordDetailRecord = React.ComponentProps<typeof ReportRecordDetail>['record'];

interface CrmObjectViewLocationState {
  reportExecutionResult?: CrmReportRecordDetailRecord;
}

export interface CrmObjectViewRouteCapabilityContext {
  objectApiName: string;
  normalizedObjectApiName: string;
  recordId?: string;
  recordData?: Record<string, unknown> | null;
  locationState?: unknown;
  currentFrontendAppId?: string | null;
  navigate: (to: string) => void;
  navigateToObjectList: () => void;
  openCreateModal: () => void;
}

export interface CrmObjectViewRouteCapability {
  shouldFetchRecord?: (context: CrmObjectViewRouteCapabilityContext) => boolean;
  onCreateNew?: (context: CrmObjectViewRouteCapabilityContext) => void;
  renderDetail?: (context: CrmObjectViewRouteCapabilityContext) => React.ReactNode;
  renderCreateModal?: (context: {
    isOpen: boolean;
    onClose: () => void;
  }) => React.ReactNode;
}

export type CrmObjectViewRouteCapabilityMap = Readonly<Record<string, CrmObjectViewRouteCapability>>;

export interface CrmObjectViewRouteCapabilityHost {
  buildAppNavigationPath: (
    frontendAppId: string | null | undefined,
    capability: 'dashboardList',
  ) => string | undefined;
}

function readCrmObjectViewLocationState(state: unknown): CrmObjectViewLocationState {
  return (state && typeof state === 'object') ? state as CrmObjectViewLocationState : {};
}

export function createCrmObjectViewRouteCapabilities(
  host: CrmObjectViewRouteCapabilityHost,
): CrmObjectViewRouteCapabilityMap {
  return {
    [CRM_DASHBOARD_OBJECT_API_NAME]: {
      shouldFetchRecord: () => false,
      onCreateNew: ({ currentFrontendAppId, navigate }) => {
        navigate(host.buildAppNavigationPath(currentFrontendAppId, 'dashboardList') ?? '/');
      },
      renderDetail: ({ recordId }) => (
        <CrmDashboardPage dashboardId={recordId || ''} />
      ),
    },
    [CRM_REPORT_OBJECT_API_NAME]: {
      shouldFetchRecord: ({ recordId, locationState }) => !(
        !!recordId
        && recordId !== 'new'
        && !!readCrmObjectViewLocationState(locationState).reportExecutionResult
      ),
      onCreateNew: ({ openCreateModal }) => openCreateModal(),
      renderDetail: ({ locationState, recordData, recordId, navigateToObjectList }) => (
        <ReportRecordDetail
          record={(readCrmObjectViewLocationState(locationState).reportExecutionResult || recordData) as CrmReportRecordDetailRecord}
          reportId={recordId}
          onBack={navigateToObjectList}
        />
      ),
      renderCreateModal: ({ isOpen, onClose }) => (
        <CreateReportModal isOpen={isOpen} onClose={onClose} />
      ),
    },
  };
}
