import type { PendingMessage } from './pending';
import type { SendState, TimelineEvent, TimelineItem } from './types';

const SENDER_RUN_MS = 5 * 60 * 1000;

export interface Group {
  key: string;
  item: TimelineItem;
  showSender: boolean;
}

/** Consecutive events from one sender within a few minutes share a header. */
export function buildGroups(list: TimelineItem[]): Group[] {
  const out: Group[] = [];
  let prevSender: string | null = null;
  let prevTs = 0;
  list.forEach((item, index) => {
    if (item.kind === 'event') {
      const e = item.event;
      const showSender = prevSender !== e.sender.user_id || Math.abs(e.timestamp_ms - prevTs) > SENDER_RUN_MS;
      prevSender = e.sender.user_id;
      prevTs = e.timestamp_ms;
      out.push({ key: e.item_id || e.event_id || `m-${index}`, item, showSender });
    } else {
      prevSender = null;
      const key = item.kind === 'historyGap' ? `gap-${item.gap.id}` : `${item.kind}-${index}`;
      out.push({ key, item, showSender: true });
    }
  });
  return out;
}

export function lastOwnSent(list: TimelineItem[]): string | null {
  for (let i = list.length - 1; i >= 0; i--) {
    const item = list[i];
    if (item.kind === 'event' && item.event.own && item.event.send_state.kind === 'Sent') return item.event.item_id;
  }
  return null;
}

export function lastSenderIs(list: TimelineItem[], userId: string | null): boolean {
  for (let i = list.length - 1; i >= 0; i -= 1) {
    const item = list[i];
    if (item.kind === 'event') return item.event.sender.user_id === userId;
  }
  return false;
}

export function pendingToEvent(p: PendingMessage, self: string | null, displayName: string | null): TimelineEvent {
  const state: SendState = p.status === 'failed' ? { kind: 'Failed', will_retry: false } : { kind: 'Sending' };
  return {
    item_id: `pending-${p.id}`,
    event_id: null,
    transaction_id: p.id,
    sender: { user_id: self ?? '', display_name: displayName, avatar: null, name_ambiguous: false },
    timestamp_ms: p.createdAt,
    own: true,
    send_state: state,
    content: {
      kind: 'Message',
      message: { kind: 'Text', body: p.body, geo_uri: null, formatted_body: p.formatted, edited: false, media: null, link_previews: [] }
    },
    reply_to: p.replyTo,
    thread_root: null,
    thread_summary: null,
    reactions: [],
    read_by: [],
    editable: false
  };
}
