import { z } from 'zod';

// Device Status Schema (for device_list)
const deviceItemSchema = z.object({
  dev_type: z.number().int().optional(),
  dev_addr: z.number().int().optional(),
  dev_loop: z.number().int().optional(),
  dev_data: z.number().int().optional()
});

// Fault Item Schema (for fault_list)
const faultItemSchema = z.object({
  dev_type: z.number().int().optional(),
  dev_addr: z.number().int().optional(),
  dev_loop: z.number().int().optional(),
  error_type: z.number().int().optional(),
  error_data: z.number().int().optional()
});

// Control Item Schema (for control_list)
const controlItemSchema = z.object({
  dev_type: z.number().int().optional(),
  dev_addr: z.number().int().optional(),
  dev_loop: z.number().int().optional(),
  loop: z.number().int().optional(), // Kafka uses 'loop'
  type_l: z.number().int().optional(),
  type_h: z.number().int().optional()
});

const listSchema = (schema) =>
  z.preprocess(
    (value) => (value === null ? [] : value),
    z.array(schema).optional().default([])
  );

// Main Kafka Payload Schema
export const kafkaPayloadSchema = z.object({
  // Required Header Fields
  ts_ms: z.number(),
  hotel_id: z.preprocess(
    (value) => (typeof value === 'string' ? Number(value) : value),
    z.number()
  ),
  room_id: z.union([z.string(), z.number()]).transform(val => String(val)),
  device_id: z.union([z.string(), z.number()]).transform(val => String(val)),
  direction: z.string(),
  cmd_word: z.union([z.string(), z.number()]).transform(val => String(val)),
  frame_id: z.number(),
  udp_raw: z.string(),

  // Optional Statistical/Status Fields
  sys_lock_status: z.number().optional().nullable(),
  report_count: z.number().optional().nullable(),
  fault_count: z.number().optional().nullable(),

  // Lists
  device_list: listSchema(deviceItemSchema),
  fault_list: listSchema(faultItemSchema),
  control_list: listSchema(controlItemSchema),

  extra: z.preprocess(
    (value) => (value === null ? {} : value),
    z.any().optional().default({})
  )
});
