import { z } from 'zod';
import { SESSION_STATUS } from './Session.const';
import { gameTypeSchema } from '../game/Game.schema';
import { playerSchema } from '../player/Player.schema';
import { gameTicketSchema, gameTurnSchema } from '../ticketing/Ticketing.schema';

export const sessionStatusSchema = z.enum(SESSION_STATUS);

export const sessionTicketSchema = z.object({
  quantity: z.number().int().positive(),
  type: gameTypeSchema,
});

export const gameSessionSchema = z.object({
  id: z.uuidv4(),
  code: z.string().length(6), // 6-char alphanumeric
  contactPhone: z.string().optional(),
  userId: z.string().optional().nullable(),

  tickets: z.array(gameTicketSchema).optional(),
  playerIds: z.array(z.uuidv4()),
  linkedPurchaseId: z.string().optional(),

  status: sessionStatusSchema.default(SESSION_STATUS.REGISTRATION),

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

export const gameSessionWithPlayersSchema = gameSessionSchema.extend({
  players: z.array(playerSchema),
  turns: z.array(gameTurnSchema).optional(),
});

export const createSessionInputSchema = z.object({
  contactPhone: z.string().optional(),
  userId: z.string().optional().nullable(),
  tickets: z.array(sessionTicketSchema).min(1),
});

export const joinSessionSchema = z.object({
  nickname: z.string().min(2),
  birthDate: z.coerce.date(),
});

export const addExistingPlayersSchema = z.object({
  playerIds: z.array(z.uuidv4()).min(1),
});

export const updateSessionStatusSchema = z.object({
  status: sessionStatusSchema,
});

export const createGameTurnInputSchema = z.object({
  assignments: z
    .array(
      z.object({
        ticketId: z.string(),
        playerId: z.uuidv4(),
      }),
    )
    .min(1),
});

export const assignSessionTicketsInputSchema = z.object({
  assignments: z
    .array(
      z.object({
        ticketId: z.string(),
        playerId: z.uuidv4(),
      }),
    )
    .min(1),
});

export const bulkCreateGameTurnSchema = z.object({
  turns: z.array(createGameTurnInputSchema).min(1),
});
