import React, { useMemo } from 'react';
import { useOptionalRuntime } from '@nexuscrm/host-sdk';
import type { CrmActivityQueryApi } from './activity-timeline-data';
import type {
  CrmActivityTimelineNavigation,
  CrmActivityTimelineObjectMetadata,
  CrmActivityTimelinePanelProps,
} from './activity-timeline-adapter';
import { resolveEmailMessageDetailTarget } from './activity-timeline-adapter';
import { RecordActivityFeedView } from './record-activity-feed';
import { useRecordActivityFeed, type FeedEntry } from './record-activity-feed-data';

/**
 * Read the tenant's core-field list off the panel's authored layout config.
 *
 * Returns undefined for absent/malformed config so the feed falls back to
 * showing every tracked field — a mis-typed config must not silently blank the
 * panel. Only non-empty strings survive, so a stray null or number in the
 * authored array cannot become a field name that matches nothing.
 */
export function parseCoreHistoryFields(config?: Record<string, unknown> | null): string[] | undefined {
  const raw = config?.coreHistoryFields;
  if (!Array.isArray(raw)) return undefined;
  const fields = raw.filter((v): v is string => typeof v === 'string' && v.trim() !== '');
  return fields.length > 0 ? fields : undefined;
}

// Adapter for the `crm.recordActivityFeed` record panel — mirrors
// createCrmActivityTimelineAdapters but simpler (no standard actions / quick
// create). Data + navigation are injected via options so this stays a
// src/-root module with no deep platform import.

export interface CrmRecordActivityFeedAdapterOptions {
  activityQueryApi: CrmActivityQueryApi;
  useNavigation: () => CrmActivityTimelineNavigation;
}

export interface CrmRecordActivityFeedAdapters<TPanelProps> {
  RecordActivityFeed: React.FC<{ recordId: string; objectApiName: string }>;
  CRMRecordActivityFeedPanel: React.FC<TPanelProps>;
}

export function createCrmRecordActivityFeedAdapters<
  TPanelProps extends CrmActivityTimelinePanelProps<CrmActivityTimelineObjectMetadata>,
>({
  activityQueryApi,
  useNavigation,
}: CrmRecordActivityFeedAdapterOptions): CrmRecordActivityFeedAdapters<TPanelProps> {
  const RecordActivityFeed: React.FC<{
    recordId: string;
    objectApiName: string;
    coreHistoryFields?: readonly string[];
  }> = ({ recordId, objectApiName, coreHistoryFields }) => {
    // Match useComments: the _System_Comment posts stream is NexusCRM-backend
    // only, so skip it for external-identity (Salesforce-connected) sessions.
    const runtime = useOptionalRuntime();
    const postsEnabled = !runtime?.usesExternalIdentitySession;
    const { entries, loading, error } = useRecordActivityFeed(
      recordId,
      objectApiName,
      activityQueryApi,
      { postsEnabled, coreHistoryFields },
    );
    const { navigateToRecord } = useNavigation();
    const onOpen = (entry: FeedEntry) => {
      const item = entry.activity;
      if (!item) return;
      // Resolve click-through exactly as the activity timeline does: email tasks
      // redirect to their EmailMessage detail; everything else opens the Task /
      // Event detail object. Fire-and-forget — the async email lookup navigates
      // when it resolves.
      void (async () => {
        const emailTarget = await resolveEmailMessageDetailTarget(activityQueryApi, item);
        if (emailTarget) {
          navigateToRecord(emailTarget.objectApiName, emailTarget.recordId);
          return;
        }
        if (item.detailObjectApiName && item.id) {
          navigateToRecord(item.detailObjectApiName, item.id);
        }
      })();
    };
    return <RecordActivityFeedView entries={entries} loading={loading} error={error} onOpen={onOpen} />;
  };

  const CRMRecordActivityFeedPanel: React.FC<TPanelProps> = ({ recordId, objectMetadata, panel }) => {
    // Memoised so the parsed array keeps a stable identity across renders — the
    // hook stabilises by value too, but re-parsing on every render is pure waste.
    const coreHistoryFields = useMemo(() => parseCoreHistoryFields(panel?.config), [panel?.config]);
    return (
      <RecordActivityFeed
        recordId={recordId}
        objectApiName={objectMetadata.name}
        coreHistoryFields={coreHistoryFields}
      />
    );
  };

  return { RecordActivityFeed, CRMRecordActivityFeedPanel };
}
