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

import { z } from 'zod';

export const accessPendingStatusSchema = z.enum(['pending', 'approved', 'rejected', 'to_delete']);

/**
 * External access entity
 */
export interface ExternalAccess {
  id: string;
  resourceName: string;
  link: string;
  login: string;
  password: string;
  comment: string | null;
  isApproved: boolean;
  createdBy: string | null;
  createdAt: string;
  updatedAt: string;
  archivedAt: string | null;
}

/**
 * External access pending entry type
 */
export interface ExternalAccessPendingEntry {
  id: string;
  resourceName: string;
  link: string;
  login: string;
  password: string;
  comment: string | null;
  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;
}

/**
 * External access unified entry type for UI diff state
 */
export interface ExternalAccessUnifiedEntry extends ExternalAccess {
  isModified?: boolean;
  isNew?: boolean;
  isPendingDelete?: boolean;
  originalData?: Partial<ExternalAccess>;
  creatorName?: string | null;
  status?: 'pending' | 'approved' | 'rejected' | 'to_delete';
  targetId?: string | null;
}

/**
 * Create external access request
 */
export interface CreateAccessRequest {
  resourceName: string;
  link: string;
  login: string;
  password: string;
  comment?: string;
}

/**
 * Update external access request
 */
export interface UpdateAccessRequest {
  resourceName?: string;
  link?: string;
  login?: string;
  password?: string;
  comment?: string;
}

/**
 * Zod schema for creating external access entry
 */
export const createAccessSchema = z.object({
  resourceName: z.string().min(1, 'Название ресурса обязательно'),
  link: z.string().min(1, 'Ссылка обязательна').url('Некорректный формат ссылки'),
  login: z.string().min(1, 'Логин обязателен'),
  password: z.string().min(1, 'Пароль обязателен'),
  comment: z.string().optional(),
});

/**
 * Zod schema for updating external access entry
 */
export const updateAccessSchema = z.object({
  resourceName: z.string().min(1).optional(),
  link: z.string().min(1).url('Некорректный формат ссылки').optional(),
  login: z.string().min(1).optional(),
  password: z.string().min(1).optional(),
  comment: z.string().optional(),
});

/**
 * Zod schema for external access entry response
 */
export const externalAccessSchema = z.object({
  id: z.string(),
  resourceName: z.string(),
  link: z.string(),
  login: z.string(),
  password: z.string(),
  comment: z.string().nullable(),
  isApproved: z.boolean(),
  createdBy: z.string().nullable(),
  createdAt: z.string(),
  updatedAt: z.string(),
  archivedAt: z.string().nullable(),
});

/**
 * Zod schema for external access pending entry response
 */
export const externalAccessPendingEntrySchema = z.object({
  id: z.string(),
  resourceName: z.string(),
  link: z.string(),
  login: z.string(),
  password: z.string(),
  comment: z.string().nullable(),
  status: accessPendingStatusSchema,
  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 external access entries array response
 */
export const externalAccessEntriesSchema = z.array(externalAccessSchema);
export const externalAccessPendingEntriesSchema = z.array(externalAccessPendingEntrySchema);

/**
 * Zod schema for success response
 */
export const accessActionResponseSchema = z.object({
  success: z.literal(true),
  message: z.string(),
});

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

/**
 * Type inference from Zod schemas
 */
export type CreateAccessInput = z.infer<typeof createAccessSchema>;
export type UpdateAccessInput = z.infer<typeof updateAccessSchema>;
export type ExternalAccessDTO = z.infer<typeof externalAccessSchema>;
