// src/shared/contracts/session.ts
// Контракты политик сессий по ролям (авторазлогин)

import { z } from 'zod';

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);

export const roleSessionPolicySchema = 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 type RoleSessionPolicy = z.infer<typeof roleSessionPolicySchema>;

const policyItemSchema = 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: 'Хотя бы один параметр должен быть указан' },
);

export const bulkRoleSessionPoliciesSchema = z.object({
  policies: z.array(policyItemSchema),
});

export type UpsertSessionPolicyInput = z.infer<typeof policyItemSchema>;

export const roleSessionPoliciesResponseSchema = z.array(roleSessionPolicySchema);
