import { useNavigate } from 'react-router';
import { StatusDot, MonoText, Badge } from '@cameleer/design-system';
import { useCorrelationChain } from '../../api/queries/correlation';
import type { ExecutionDetail } from '../../components/ExecutionDiagram/types';
import styles from './ExchangeHeader.module.css';

interface ExchangeHeaderProps {
  detail: ExecutionDetail;
}

type StatusVariant = 'success' | 'error' | 'running' | 'warning';

function statusVariant(s: string): StatusVariant {
  switch (s) {
    case 'COMPLETED': return 'success';
    case 'FAILED': return 'error';
    case 'RUNNING': return 'running';
    default: return 'warning';
  }
}

function statusLabel(s: string): string {
  switch (s) {
    case 'COMPLETED': return 'OK';
    case 'FAILED': return 'ERR';
    case 'RUNNING': return 'RUN';
    default: return s;
  }
}

function formatDuration(ms: number): string {
  if (ms >= 60_000) return `${(ms / 1000).toFixed(0)}s`;
  if (ms >= 1000) return `${(ms / 1000).toFixed(2)}s`;
  return `${ms}ms`;
}

export function ExchangeHeader({ detail }: ExchangeHeaderProps) {
  const navigate = useNavigate();
  const { data: chainResult } = useCorrelationChain(detail.correlationId ?? null);
  const chain = chainResult?.data;
  const showChain = chain && chain.length > 1;
  const attrs = Object.entries(detail.attributes ?? {});

  return (
    <div className={styles.header}>
      {/* Exchange info — always shown */}
      <div className={styles.info}>
        <StatusDot variant={statusVariant(detail.status)} />
        <Badge label={statusLabel(detail.status)} color={statusVariant(detail.status)} />
        {attrs.length > 0 && (
          <>
            <span className={styles.separator} />
            {attrs.map(([k, v]) => (
              <Badge key={k} label={`${k}: ${v}`} color="auto" />
            ))}
          </>
        )}
        <span className={styles.separator} />
        <MonoText size="xs">{detail.exchangeId || detail.executionId}</MonoText>
        <span className={styles.separator} />
        <span className={styles.route}>{detail.routeId}</span>
        <span className={styles.app}>{detail.applicationName}</span>
        <span className={styles.duration}>{formatDuration(detail.durationMs)}</span>
      </div>

      {/* Correlation chain — only when multiple correlated exchanges exist */}
      {showChain && (
        <div className={styles.chain}>
          <span className={styles.chainLabel}>Correlated</span>
          {chain.map((ce: any, i: number) => {
            const isCurrent = ce.executionId === detail.executionId;
            const variant = statusVariant(ce.status);
            const statusCls =
              variant === 'success' ? styles.chainNodeSuccess
              : variant === 'error' ? styles.chainNodeError
              : variant === 'running' ? styles.chainNodeRunning
              : styles.chainNodeWarning;
            return (
              <span key={ce.executionId} className={styles.chainEntry}>
                {i > 0 && <span className={styles.chainArrow}>&rarr;</span>}
                <button
                  className={`${styles.chainNode} ${statusCls} ${isCurrent ? styles.chainNodeCurrent : ''}`}
                  onClick={() => {
                    if (!isCurrent) {
                      navigate(`/exchanges/${ce.applicationName ?? detail.applicationName}/${ce.routeId}/${ce.executionId}`);
                    }
                  }}
                  title={`${ce.executionId}\n${ce.routeId} \u2014 ${formatDuration(ce.durationMs)}`}
                >
                  <StatusDot variant={variant} />
                  <span className={styles.chainRoute}>{ce.routeId}</span>
                  <span className={styles.chainDuration}>{formatDuration(ce.durationMs)}</span>
                </button>
              </span>
            );
          })}
        </div>
      )}
    </div>
  );
}
