// src/shared/contracts/blacklist.ts
// Contracts for blacklist feature - Zod schemas and types

import { z } from 'zod';

/**
 * Blacklist entry type
 */
export interface BlacklistEntry {
  id: string;
  name: string;
  phone: string;
  bookingEngineCheck: 'YES' | 'NO';
  comment: string | null;
  isApproved: boolean;
  createdBy: string | null;
  createdAt: string;
  updatedAt: string;
  archivedAt: string | null;
}

/**
 * Blacklist pending entry type (для записей на согласовании)
 */
export interface BlacklistPendingEntry {
  id: string;
  name: string;
  phone: string;
  bookingEngineCheck: 'YES' | 'NO';
  comment: string | null;
  status: 'pending' | 'approved' | 'rejected' | 'to_delete';
  targetId: string | null; // ID оригинальной записи в таблице blacklist
  createdBy: string | null;
  creatorName: string | null; // Имя сотрудника, создавшего запись
  reviewedBy: string | null;
  reviewedAt: string | null;
  rejectionReason: string | null;
  createdAt: string;
  updatedAt: string;
}

/**
 * Extended type for unified list with diff information
 */
export interface BlacklistUnifiedEntry extends BlacklistEntry {
  isModified?: boolean;  // true если это редактирование существующей записи
  isNew?: boolean;       // true если это новая запись (без targetId)
  isPendingDelete?: boolean;  // true если это запрос на удаление
  originalData?: Partial<BlacklistEntry>; // оригинальные данные для diff
  creatorName?: string | null; // Имя сотрудника, создавшего запись
}

/**
 * Create blacklist entry request
 */
export interface BlacklistCreateRequest {
  name: string;
  phone: string;
  bookingEngineCheck: 'YES' | 'NO';
  comment?: string;
}

/**
 * Update blacklist entry request
 */
export interface BlacklistUpdateRequest {
  name?: string;
  phone?: string;
  bookingEngineCheck?: 'YES' | 'NO';
  comment?: string;
}

/**
 * Zod schema for creating blacklist entry
 */
export const blacklistCreateSchema = z.object({
  name: z.string().min(1, 'Полное имя обязательно'),
  phone: z.string().min(1, 'Телефон обязателен'),
  bookingEngineCheck: z.enum(['YES', 'NO'], { message: 'Проверка системы бронирования обязательна' }).default('NO'),
  comment: z.string().optional(),
});

/**
 * Zod schema for updating blacklist entry
 */
export const blacklistUpdateSchema = z.object({
  name: z.string().min(1).optional(),
  phone: z.string().min(1).optional(),
  bookingEngineCheck: z.enum(['YES', 'NO']).optional(),
  comment: z.string().optional(),
});

/**
 * Zod schema for blacklist entry response
 */
export const blacklistEntrySchema = z.object({
  id: z.string(),
  name: z.string(),
  phone: z.string(),
  bookingEngineCheck: z.enum(['YES', 'NO']),
  comment: z.string().nullable(),
  isApproved: z.boolean(),
  createdBy: z.string().nullable(),
  createdAt: z.string(),
  updatedAt: z.string(),
  archivedAt: z.string().nullable(),
});

/**
 * Zod schema for blacklist entries array response
 */
export const blacklistEntriesSchema = z.array(blacklistEntrySchema);

/**
 * Zod schema for approve/reject response
 */
export const blacklistActionResponseSchema = z.object({
  success: z.literal(true),
  message: z.string(),
  count: z.number().optional(),
});

/**
 * Zod schema for error response
 */
export const blacklistErrorResponseSchema = z.object({
  success: z.literal(false),
  error: z.object({
    message: z.string(),
    code: z.string(),
  }),
});
