// src/server/features/rooms/rooms.schema.ts
// Zod schemas for rooms validation

import { z } from 'zod';

// Room type enum
export const roomTypeEnum = z.enum(['апарт', 'номер']);

// Room ID validation: буква A-Z и число 1-99
export const roomIdSchema = z.string()
  .regex(/^[A-Z][1-9][0-9]?$/, 'Invalid room ID. Format: буква A-Z + число 1-99 (например, A1, B12)');

// Room creation schema
export const createRoomSchema = z.object({
  id: roomIdSchema,
  type: roomTypeEnum,
  hasHood: z.boolean().optional().default(false),
  beds: z.number().int().min(1, 'Минимум 1 кровать').max(10, 'Максимум 10 кроватей').optional().default(2),
  armchair: z.boolean().optional().default(false),
  airCond: z.boolean().optional().default(false),
  isRepairing: z.boolean().optional().default(false),
  repairReason: z.string().optional(),
  comment: z.string().optional(),
}).refine((data) => {
  // Если тип не 'апарт', то hasHood должен быть false
  if (data.type !== 'апарт' && data.hasHood) {
    return false;
  }
  return true;
}, {
  message: 'Вытяжка доступна только для типа "апарт"',
  path: ['hasHood'],
});

// Room update schema
export const updateRoomSchema = z.object({
  id: roomIdSchema.optional(),
  type: roomTypeEnum.optional(),
  hasHood: z.boolean().optional(),
  beds: z.number().int().min(1, 'Минимум 1 кровать').max(10, 'Максимум 10 кроватей').optional(),
  armchair: z.boolean().optional(),
  airCond: z.boolean().optional(),
  isRepairing: z.boolean().optional(),
  repairReason: z.string().optional(),
  comment: z.string().optional(),
}).refine((data) => {
  // Если тип меняется на не 'апарт', то hasHood должен быть false
  if (data.type && data.type !== 'апарт' && data.hasHood) {
    return false;
  }
  // Если тип не 'апарт' (новый или старый), то hasHood должен быть false
  if (data.hasHood && data.type === undefined) {
    // В этом случае нужно проверить текущий тип в сервисе
    return true; // Валидация пройдет, но сервис проверит
  }
  return true;
}, {
  message: 'Вытяжка доступна только для типа "апарт"',
  path: ['hasHood'],
});

// Response schema
export const roomResponseSchema = z.object({
  id: z.string(),
  type: z.string(),
  hasHood: z.boolean(),
  beds: z.number(),
  armchair: z.boolean(),
  airCond: z.boolean(),
  isRepairing: z.boolean(),
  repairReason: z.string().nullable(),
  comment: z.string().nullable(),
  createdAt: z.string(),
  updatedAt: z.string(),
});

// Response wrapper schemas
export const roomListResponseSchema = z.object({
  success: z.boolean(),
  data: z.array(roomResponseSchema),
});

export const roomResponseWrapperSchema = z.object({
  success: z.boolean(),
  data: roomResponseSchema,
});

export const errorResponseSchema = z.object({
  success: z.boolean(),
  error: z.object({
    message: z.string(),
    code: z.string(),
  }),
});

// Types
export type CreateRoomInput = z.infer<typeof createRoomSchema>;
export type UpdateRoomInput = z.infer<typeof updateRoomSchema>;
export type RoomResponse = z.infer<typeof roomResponseSchema>;
