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

import { z } from 'zod';

/**
 * Contractor entry type (unified for both approved and pending entries)
 */
export interface ContractorEntry {
  id: string;
  name: string;
  category: string;
  contractNumber: string | null;
  phone: string;
  email: string | null;
  webLink: string | null;
  managerName: string | null;
  managerPhone: string | null;
  managerEmail: string | null;
  comment: string | null;
  isApproved: boolean;
  status?: 'pending' | 'approved' | 'rejected' | 'to_delete';
  targetId: string | null;
  createdBy: string | null;
  creatorName: string | null;
  reviewedBy: string | null;
  reviewedAt: string | null;
  rejectionReason: string | null;
  createdAt: string;
  updatedAt: string;
  archivedAt: string | null;
}

/**
 * Contractor pending entry type (для записей на согласовании)
 */
export interface ContractorPendingEntry {
  id: string;
  name: string;
  category: string;
  contractNumber: string | null;
  phone: string;
  email: string | null;
  webLink: string | null;
  managerName: string | null;
  managerPhone: string | null;
  managerEmail: string | null;
  comment: string | null;
  status: 'pending' | 'approved' | 'rejected' | 'to_delete';
  targetId: string | null; // ID оригинальной записи в таблице contractors
  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 ContractorUnifiedEntry extends Omit<ContractorEntry, 'creatorName'> {
  isModified?: boolean;  // true если это редактирование существующей записи
  isNew?: boolean;       // true если это новая запись (без targetId)
  isPendingDelete?: boolean;  // true если это запрос на удаление
  originalData?: Partial<ContractorEntry>; // оригинальные данные для diff
  creatorName?: string | null; // Имя сотрудника, создавшего запись
}

/**
 * Create contractor entry request
 */
export interface ContractorCreateRequest {
  name: string;
  category: string;
  contractNumber: string | null;
  phone: string;
  email: string | null;
  webLink: string | null;
  managerName: string | null;
  managerPhone: string | null;
  managerEmail: string | null;
  comment: string | null;
}

/**
 * Update contractor entry request
 */
export interface ContractorUpdateRequest {
  name?: string;
  category?: string;
  contractNumber: string | null;
  phone?: string;
  email: string | null;
  webLink: string | null;
  managerName: string | null;
  managerPhone: string | null;
  managerEmail: string | null;
  comment: string | null;
}

/**
 * Zod schema for creating contractor entry
 */
export const contractorCreateSchema = z.object({
  name: z.string().min(1, 'Название обязательно'),
  category: z.string().min(1, 'Категория обязательна'),
  contractNumber: z.string().nullable(),
  phone: z.string().min(1, 'Телефон обязателен'),
  email: z.string().nullable(),
  webLink: z.string().nullable(),
  managerName: z.string().nullable(),
  managerPhone: z.string().nullable(),
  managerEmail: z.string().nullable(),
  comment: z.string().nullable(),
});

/**
 * Zod schema for updating contractor entry
 */
export const contractorUpdateSchema = z.object({
  name: z.string().min(1).optional(),
  category: z.string().min(1).optional(),
  contractNumber: z.string().nullable(),
  phone: z.string().min(1).optional(),
  email: z.string().nullable(),
  webLink: z.string().nullable(),
  managerName: z.string().nullable(),
  managerPhone: z.string().nullable(),
  managerEmail: z.string().nullable(),
  comment: z.string().nullable(),
});

/**
 * Zod schema for contractor entry response (unified for both approved and pending entries)
 */
export const contractorEntrySchema = z.object({
  id: z.string(),
  name: z.string(),
  category: z.string(),
  contractNumber: z.string().nullable(),
  phone: z.string(),
  email: z.string().nullable(),
  webLink: z.string().nullable(),
  managerName: z.string().nullable(),
  managerPhone: z.string().nullable(),
  managerEmail: z.string().nullable(),
  comment: z.string().nullable(),
  isApproved: z.boolean(),
  status: z.enum(['pending', 'approved', 'rejected', 'to_delete']).optional(),
  targetId: z.string().nullable(),
  createdBy: z.string().nullable(),
  creatorName: z.string().nullable(),
  reviewedBy: z.string().nullable(),
  reviewedAt: z.string().nullable(),
  rejectionReason: z.string().nullable(),
  createdAt: z.string(),
  updatedAt: z.string(),
  archivedAt: z.string().nullable(),
});

/**
 * Zod schema for contractor entries array response
 */
export const contractorEntriesSchema = z.array(contractorEntrySchema);

/**
 * Zod schema for contractor pending entry response
 */
export const contractorPendingEntrySchema = z.object({
  id: z.string(),
  name: z.string(),
  category: z.string(),
  contractNumber: z.string().nullable(),
  phone: z.string(),
  email: z.string().nullable(),
  webLink: z.string().nullable(),
  managerName: z.string().nullable(),
  managerPhone: z.string().nullable(),
  managerEmail: z.string().nullable(),
  comment: z.string().nullable(),
  status: z.enum(['pending', 'approved', 'rejected', 'to_delete']),
  targetId: z.string().nullable(),
  createdBy: z.string().nullable(),
  creatorName: z.string().nullable(),
  reviewedBy: z.string().nullable(),
  reviewedAt: z.string().nullable(),
  rejectionReason: z.string().nullable(),
  createdAt: z.string(),
  updatedAt: z.string(),
});

/**
 * Zod schema for contractor pending entries array response
 */
export const contractorPendingEntriesSchema = z.array(contractorPendingEntrySchema);

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

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