// src/client/entities/blacklist/model/unifiedList.ts
// Unified list calculation logic for blacklist entries

import type { BlacklistEntry, BlacklistUnifiedEntry } from '@shared/contracts/blacklist';
import type { BlacklistPendingEntryResponse } from '../../../shared/api/repositories/BlacklistRepository';

/**
 * Calculate unified list combining entries and pending entries
 * For pending entries with targetId: replaces original and adds isModified/originalData flags
 * For pending entries without targetId: adds as new with isNew flag
 * For pending entries with to_delete status: adds isPendingDelete flag
 */
export function calculateUnifiedList(
  entries: BlacklistEntry[],
  pendingEntries: BlacklistPendingEntryResponse[]
): BlacklistUnifiedEntry[] {
  // Собираем ID оригинальных записей, которые редактируются
  const targetIds = new Set(
    pendingEntries
      .filter((p: BlacklistPendingEntryResponse) => p.targetId !== null)
      .map((p: BlacklistPendingEntryResponse) => p.targetId!)
  );

  // Создаем Map для быстрого доступа к оригинальным записям
  const entriesMap = new Map(
    entries.map((e) => [e.id, e])
  );

  // Обрабатываем pending записи с targetId (редактирования и удаления)
  const modifiedEntries: BlacklistUnifiedEntry[] = [];
  for (const pending of pendingEntries) {
    if (pending.targetId) {
      const original = entriesMap.get(pending.targetId);
      if (original) {
        const isDeleteRequest = pending.status === 'to_delete';
        modifiedEntries.push({
          // Для isPendingDelete используем pending.id, иначе original.id
          id: isDeleteRequest ? pending.id : original.id,
          name: pending.name,
          phone: pending.phone,
          bookingEngineCheck: pending.bookingEngineCheck,
          comment: pending.comment,
          isApproved: original.isApproved,
          createdBy: pending.createdBy,
          createdAt: original.createdAt,
          updatedAt: pending.updatedAt,
          archivedAt: original.archivedAt,
          isModified: !isDeleteRequest,
          isNew: false,
          isPendingDelete: isDeleteRequest,
          originalData: {
            name: original.name,
            phone: original.phone,
            bookingEngineCheck: original.bookingEngineCheck,
            comment: original.comment,
          },
          // Добавляем creatorName для отображения в UI
          ...(pending.creatorName && { creatorName: pending.creatorName }),
        });
      }
    }
  }

  // Обрабатываем pending записи без targetId (новые записи)
  const newEntries: BlacklistUnifiedEntry[] = pendingEntries
    .filter((p) => p.targetId === null)
    .map((p) => ({
      id: p.id,
      name: p.name,
      phone: p.phone,
      bookingEngineCheck: p.bookingEngineCheck,
      comment: p.comment,
      isApproved: false,
      createdBy: p.createdBy,
      createdAt: p.createdAt,
      updatedAt: p.updatedAt,
      archivedAt: null,
      isModified: false,
      isNew: true,
      isPendingDelete: false,
      // Добавляем creatorName для отображения в UI
      ...(p.creatorName && { creatorName: p.creatorName }),
    }));

  // Фильтруем оригинальные записи: оставляем только те, у которых нет pending версии
  const filteredEntries = entries.filter((e) => !targetIds.has(e.id));

  // Объединяем и сортируем по createdAt
  return [...filteredEntries, ...modifiedEntries, ...newEntries].sort(
    (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()
  );
}
