import { z } from 'zod';

/**
 * EN: Access Management DTOs
 * VI: DTOs cho Quản Lý Truy Cập
 */

// =============================================================================
// Access Request DTOs
// =============================================================================

export const CreateAccessRequestDto = z.object({
  resource: z.string().min(1, 'Resource is required / Resource là bắt buộc'),
  action: z.string().min(1, 'Action is required / Action là bắt buộc'),
  reason: z.string().max(1000).optional(),
  expiresAt: z.string().datetime().optional(),
  metadata: z.record(z.string(), z.any()).optional(),
});

export type CreateAccessRequestDto = z.infer<typeof CreateAccessRequestDto>;

export const ApproveAccessRequestDto = z.object({
  comments: z.string().max(1000).optional(),
});

export type ApproveAccessRequestDto = z.infer<typeof ApproveAccessRequestDto>;

export const RejectAccessRequestDto = z.object({
  comments: z.string().min(1, 'Comments are required for rejection / Bình luận là bắt buộc khi từ chối').max(1000),
});

export type RejectAccessRequestDto = z.infer<typeof RejectAccessRequestDto>;

// =============================================================================
// Access Review DTOs
// =============================================================================

export const CreateAccessReviewDto = z.object({
  name: z.string().min(1, 'Review name is required / Tên đánh giá là bắt buộc').max(255),
  description: z.string().max(2000).optional(),
  type: z.enum(['PERIODIC', 'ADHOC', 'CERTIFICATION']),
  startDate: z.string().datetime('Invalid start date format / Định dạng ngày bắt đầu không hợp lệ'),
  endDate: z.string().datetime('Invalid end date format / Định dạng ngày kết thúc không hợp lệ'),
});

export type CreateAccessReviewDto = z.infer<typeof CreateAccessReviewDto>;

export const UpdateAccessReviewDto = z.object({
  name: z.string().min(1).max(255).optional(),
  description: z.string().max(2000).optional(),
  startDate: z.string().datetime().optional(),
  endDate: z.string().datetime().optional(),
});

export type UpdateAccessReviewDto = z.infer<typeof UpdateAccessReviewDto>;

export const ReviewAccessItemDto = z.object({
  status: z.enum(['APPROVED', 'REVOKED', 'NO_CHANGE']),
  comments: z.string().max(1000).optional(),
});

export type ReviewAccessItemDto = z.infer<typeof ReviewAccessItemDto>;

// =============================================================================
// Access Analytics DTOs
// =============================================================================

export const DateRangeDto = z.object({
  startDate: z.string().datetime('Invalid start date format / Định dạng ngày bắt đầu không hợp lệ'),
  endDate: z.string().datetime('Invalid end date format / Định dạng ngày kết thúc không hợp lệ'),
});

export type DateRangeDto = z.infer<typeof DateRangeDto>;

export const RiskFiltersDto = z.object({
  minScore: z.number().int().min(0).max(100).optional(),
  maxScore: z.number().int().min(0).max(100).optional(),
  level: z.enum(['LOW', 'MEDIUM', 'HIGH', 'CRITICAL']).optional(),
  userId: z.string().optional(),
});

export type RiskFiltersDto = z.infer<typeof RiskFiltersDto>;
