import { z } from 'zod';

export const serverPropertiesSchema = z
  .object({
    'motd': z.string().max(256).optional(),
    'gamemode': z
      .enum(['survival', 'creative', 'adventure', 'spectator'])
      .optional(),
    'difficulty': z.enum(['peaceful', 'easy', 'normal', 'hard']).optional(),
    'hardcore': z.boolean().optional(),
    'max-players': z.number().int().min(1).max(1000).optional(),
    'pvp': z.boolean().optional(),
    'white-list': z.boolean().optional(),
    'enable-command-block': z.boolean().optional(),
    'view-distance': z.number().int().min(3).max(32).optional(),
    'simulation-distance': z.number().int().min(3).max(32).optional(),
    'spawn-protection': z.number().int().min(0).optional(),
    'allow-flight': z.boolean().optional(),
    'online-mode': z.boolean().optional(),
    'enable-query': z.boolean().optional(),
    'enable-rcon': z.boolean().optional(),
    'level-seed': z.string().max(64).optional(),
    'level-name': z.string().max(64).optional(),
    'resource-pack': z.string().url().optional().or(z.literal('')),
    'resource-pack-sha1': z.string().max(64).optional(),
    'allow-nether': z.boolean().optional(),
  })
  .catchall(z.union([z.string(), z.number(), z.boolean()]));

export const updateServerPropertiesSchema = serverPropertiesSchema.partial();

export const serverPropertiesResponseSchema = z.object({
  properties: serverPropertiesSchema,
  raw: z.string(),
});

export type ServerProperties = z.infer<typeof serverPropertiesSchema>;
export type UpdateServerProperties = z.infer<typeof updateServerPropertiesSchema>;
export type ServerPropertiesResponse = z.infer<
  typeof serverPropertiesResponseSchema
>;
