// src/server/features/system/system.schema.ts
// Zod schemas for system feature validation

import { z } from 'zod';
import { LogConfigSchema, UpdateLogConfigSchema } from '@shared/contracts/logger';

const hexColorSchema = z.string().regex(/^#[0-9A-Fa-f]{6}$/, 'Цвет должен быть в формате HEX (#RRGGBB)');

const logoutTimeSchema = z
  .string()
  .regex(/^\d{2}:\d{2}$/, 'Формат: HH:mm')
  .nullable()
  .default(null);

const minutesSchema = z
  .number()
  .int()
  .min(1, 'Минимум 1 минута')
  .nullable()
  .default(null);

// Wrapper for standard API responses
const createApiResponse = <T extends z.ZodTypeAny>(dataSchema: T) =>
  z.object({
    success: z.boolean(),
    data: dataSchema,
  });

// GET /logs Response
export const getLogConfigResponseSchema = createApiResponse(LogConfigSchema);

// PATCH /logs Request Body
export const updateLogConfigBodySchema = UpdateLogConfigSchema;

// PATCH /logs Response
export const updateLogConfigResponseSchema = createApiResponse(LogConfigSchema);

// Error Response
export const errorResponseSchema = z.object({
  success: z.boolean(),
  error: z.string(),
});

// Role Permission Schemas
export const rolePermissionSchema = z.object({
  id: z.string().uuid(),
  role: z.string(),
  resource: z.string(),
  action: z.string(),
  isEnabled: z.boolean(),
  createdAt: z.string().or(z.date()),
  updatedAt: z.string().or(z.date()),
});

export const createRolePermissionSchema = z.object({
  role: z.string().min(1),
  resource: z.string().min(1),
  action: z.string().min(1),
  isEnabled: z.boolean().default(true),
});

export const updateRolePermissionSchema = z.object({
  id: z.string().uuid(),
  isEnabled: z.boolean(),
});

export const bulkUpdatePermissionsSchema = z.object({
  permissions: z.array(z.object({
    role: z.string(),
    resource: z.string(),
    action: z.string(),
    isEnabled: z.boolean(),
  })),
});

// System Module Schemas
export const systemModuleSchema = z.object({
  id: z.string().uuid(),
  moduleId: z.string(),
  isEnabled: z.boolean(),
  createdAt: z.string().or(z.date()),
  updatedAt: z.string().or(z.date()),
});

// Role Colors Schemas
export const roleColorsSchema = z.object({
  id: z.string().uuid(),
  role: z.string(),
  privateNormal: hexColorSchema,
  privateHigh: hexColorSchema,
  publicNormal: hexColorSchema,
  publicHigh: hexColorSchema,
  createdAt: z.string().or(z.date()),
  updatedAt: z.string().or(z.date()),
});

export const updateRoleColorsBodySchema = z.object({
  privateNormal: hexColorSchema,
  privateHigh: hexColorSchema,
  publicNormal: hexColorSchema,
  publicHigh: hexColorSchema,
});

export const roleParamSchema = z.object({
  role: z.string().min(1),
});

export const createSystemModuleSchema = z.object({
  moduleId: z.string().min(1),
  isEnabled: z.boolean().default(true),
});

export const updateSystemModuleSchema = z.object({
  id: z.string().uuid(),
  isEnabled: z.boolean(),
});

export const bulkUpdateModulesSchema = z.object({
  modules: z.array(z.object({
    id: z.string().uuid(),
    isEnabled: z.boolean(),
  })),
});

// Response Schemas
export const getPermissionsResponseSchema = createApiResponse(z.array(rolePermissionSchema));
export const getMyPermissionsResponseSchema = createApiResponse(z.array(z.string()));
export const getModulesResponseSchema = createApiResponse(z.array(systemModuleSchema));
export const getRoleColorsResponseSchema = createApiResponse(z.array(roleColorsSchema));

export const sessionPolicySchema = z.object({
  id: z.string().uuid(),
  role: z.string(),
  logoutTime: logoutTimeSchema,
  inactivityTimeout: minutesSchema,
  sessionDuration: minutesSchema,
  createdAt: z.string().or(z.date()),
  updatedAt: z.string().or(z.date()),
});

export const sessionPolicyItemSchema = z.object({
  role: z.string().min(1),
  logoutTime: logoutTimeSchema,
  inactivityTimeout: minutesSchema,
  sessionDuration: minutesSchema,
}).refine(
  (data) => data.logoutTime !== null || data.inactivityTimeout !== null || data.sessionDuration !== null,
  { message: 'Хотя бы один параметр должен быть указан', path: ['role'] },
);

export const bulkSessionPoliciesBodySchema = z.object({
  policies: z.array(sessionPolicyItemSchema),
});

export const getSessionPoliciesResponseSchema = createApiResponse(z.array(sessionPolicySchema));
