import type { InfiniteData } from '@tanstack/react-query';
import type { Conversation } from '../contexts/ChatContext';

export interface ConversationsPage {
  items: Conversation[];
  next_cursor: string | null;
}

export type ConversationsPagesData = InfiniteData<ConversationsPage, string | null>;

export const normalizeConversationsPage = (payload: unknown): ConversationsPage => {
  if (Array.isArray(payload)) {
    return { items: payload as Conversation[], next_cursor: null };
  }
  if (!payload || typeof payload !== 'object') {
    return { items: [], next_cursor: null };
  }
  const page = payload as { items?: unknown; next_cursor?: unknown };
  return {
    items: Array.isArray(page.items) ? page.items as Conversation[] : [],
    next_cursor: typeof page.next_cursor === 'string' && page.next_cursor ? page.next_cursor : null,
  };
};

export const flattenConversationPages = (data?: ConversationsPagesData): Conversation[] => {
  if (!data) return [];
  const conversationsById = new Map<string, Conversation>();
  for (const page of data.pages) {
    for (const conversation of page.items) {
      if (!conversationsById.has(conversation.conversation_id)) {
        conversationsById.set(conversation.conversation_id, conversation);
      }
    }
  }
  return Array.from(conversationsById.values());
};

export const createConversationsPagesData = (conversation: Conversation): ConversationsPagesData => ({
  pages: [{ items: [conversation], next_cursor: null }],
  pageParams: [null],
});

export const prependConversationToPages = (
  data: ConversationsPagesData | undefined,
  conversation: Conversation,
): ConversationsPagesData => {
  if (!data || data.pages.length === 0) {
    return createConversationsPagesData(conversation);
  }
  return {
    ...data,
    pages: data.pages.map((page, index) => ({
      ...page,
      items: index === 0
        ? [
            conversation,
            ...page.items.filter(item => item.conversation_id !== conversation.conversation_id),
          ]
        : page.items.filter(item => item.conversation_id !== conversation.conversation_id),
    })),
  };
};

export const updateConversationTitleInPages = (
  data: ConversationsPagesData | undefined,
  conversationId: string,
  title: string,
): ConversationsPagesData | undefined => {
  if (!data) return data;
  return {
    ...data,
    pages: data.pages.map(page => ({
      ...page,
      items: page.items.map(conversation => (
        conversation.conversation_id === conversationId
          ? { ...conversation, title }
          : conversation
      )),
    })),
  };
};

export const removeConversationFromPages = (
  data: ConversationsPagesData | undefined,
  conversationId: string,
): ConversationsPagesData | undefined => {
  if (!data) return data;
  return {
    ...data,
    pages: data.pages.map(page => ({
      ...page,
      items: page.items.filter(conversation => conversation.conversation_id !== conversationId),
    })),
  };
};
