// src/server/features/blacklist/lib/blacklist.mapper.ts
// Mapper functions for transforming database rows to DTOs

import type { BlacklistEntry, BlacklistPendingEntry, BlacklistEntryWithMetadata } from '../blacklist.schema';

/**
 * Преобразовать запись БД в BlacklistEntry
 */
export function mapToBlacklistEntry(entry: any): BlacklistEntry {
  return {
    id: entry.id,
    name: entry.name,
    phone: entry.phone,
    bookingEngineCheck: entry.bookingEngineCheck as 'YES' | 'NO',
    comment: entry.comment,
    isApproved: entry.isApproved,
    createdBy: entry.createdBy,
    createdAt: entry.createdAt.toISOString(),
    updatedAt: entry.updatedAt.toISOString(),
    archivedAt: entry.archivedAt?.toISOString() || null,
  };
}

/**
 * Преобразовать pending запись БД в BlacklistEntry
 * (для совместимости с фронтендом)
 */
export function mapPendingToBlacklistEntry(entry: any): BlacklistEntry {
  return {
    id: entry.id,
    name: entry.name,
    phone: entry.phone,
    bookingEngineCheck: entry.bookingEngineCheck as 'YES' | 'NO',
    comment: entry.comment,
    isApproved: false, // Pending записи всегда не одобрены
    createdBy: entry.createdBy,
    createdAt: entry.createdAt.toISOString(),
    updatedAt: entry.updatedAt.toISOString(),
    archivedAt: null,
  };
}

/**
 * Преобразовать запись БД в BlacklistPendingEntry
 */
export function mapToBlacklistPendingEntry(entry: any): BlacklistPendingEntry {
  return {
    id: entry.id,
    name: entry.name,
    phone: entry.phone,
    bookingEngineCheck: entry.bookingEngineCheck as 'YES' | 'NO',
    comment: entry.comment,
    status: entry.status as 'pending' | 'approved' | 'rejected',
    targetId: entry.targetId,
    createdBy: entry.createdBy,
    creatorName: entry.creatorName || null,
    reviewedBy: entry.reviewedBy,
    reviewedAt: entry.reviewedAt?.toISOString() || null,
    rejectionReason: entry.rejectionReason,
    createdAt: entry.createdAt.toISOString(),
    updatedAt: entry.updatedAt.toISOString(),
  };
}

/**
 * Преобразовать pending запись БД в BlacklistEntry с метаданными
 * Используется для отправки полных данных на фронтенд через сокеты
 * Включает targetId и status для корректной обработки запросов на удаление
 */
export function mapPendingToBlacklistEntryWithMetadata(entry: any): BlacklistEntryWithMetadata {
  return {
    id: entry.id,
    name: entry.name,
    phone: entry.phone,
    bookingEngineCheck: entry.bookingEngineCheck as 'YES' | 'NO',
    comment: entry.comment,
    isApproved: false, // Pending записи всегда не одобрены
    createdBy: entry.createdBy,
    createdAt: entry.createdAt.toISOString(),
    updatedAt: entry.updatedAt.toISOString(),
    archivedAt: null,
    // Метаданные для обработки на фронтенде
    targetId: entry.targetId,
    status: entry.status,
    creatorName: entry.creatorName || null,
  };
}
