import { z } from 'zod';
import { PLAYER_TYPE } from './Player.const';

export const playerTypeSchema = z.enum(PLAYER_TYPE);

export const playerWaiverStatusSchema = z.object({
  isSigned: z.boolean().default(false),
  waiverId: z.uuidv4().nullable().optional(),
  templateVersion: z.string().optional(),
  expiresAt: z.date().nullable().optional(),
});

export const playerStatsSchema = z.object({
  totalRaces: z.number().int().default(0),
  bestTimeMs: z.number().int().nullable().optional(),
  xp: z.number().int().default(0),
});

export const playerSchema = z.object({
  id: z.uuidv4(),
  nickname: z.string().min(2).max(20),
  avatarUrl: z.url().optional(),
  birthDate: z.date(),
  type: playerTypeSchema.default(PLAYER_TYPE.ADULT),

  ownerUserId: z.uuidv4().nullable().optional(),
  isGuest: z.boolean().default(true),
  waiver: playerWaiverStatusSchema,

  // TODO: Add the stats here, to aovid extra queries
  stats: playerStatsSchema.optional().nullable(),

  createdAt: z.date(),
  updatedAt: z.date(),
});

export const createPlayerSchema = playerSchema
  .pick({
    nickname: true,
    ownerUserId: true,
    isGuest: true,
  })
  .extend({
    birthDate: z.coerce.date(),
  });

export const signWaiverSchema = z.object({
  signature: z.string().optional(), // Base64 or simply a boolean acceptance. Let's make it flexible.
  accepted: z.literal(true), // They must explicitly pass accepted: true
});
