import { z } from 'zod';
import {
  GAME_TICKET_STATUS,
  GAME_TURN_CHECK,
  GAME_TURN_STATUS,
  GAME_TURN_TASK_STATUS,
  GAME_TURN_TASK_TYPE,
  PURCHASE_STATUS,
  TICKET_TYPE,
  TICKET_USER_TYPE,
} from './Ticketing.const';
import { gameTypeSchema } from '../game';

export const gameTicketStatusSchema = z.enum(GAME_TICKET_STATUS);
export const ticketUserTypeSchema = z.enum(TICKET_USER_TYPE);
export const ticketTypeSchema = z.enum(TICKET_TYPE);
export const ticketSummarySchema = z.record(ticketTypeSchema, z.number());

export const gameTicketSchema = z.object({
  id: z.uuidv4(),
  purchaseId: z.string(),
  sessionId: z.string().optional().nullable(),
  gameTurnId: z.string().optional().nullable(),
  playerId: z.uuidv4().optional().nullable(),
  status: gameTicketStatusSchema,
  type: ticketTypeSchema.default(TICKET_TYPE.RACE),
  createdAt: z.date(),
  updatedAt: z.date(),
  completedAt: z.date().optional(),
});

export const purchaseStatusSchema = z.enum(PURCHASE_STATUS);

export const purchaseItemSchema = z.object({
  ticketType: gameTypeSchema,
  quantity: z.number().int().positive(),
  priceCents: z.number().int().nonnegative(),
});

export const purchaseSchema = z.object({
  id: z.uuidv4(),
  purchaseNumber: z.number(),

  // Buyer can be null for Guest/On-Site purchases
  buyerUserId: z.string().optional().nullable(),
  guestName: z.string().optional().nullable(),
  guestContact: z.string().optional().nullable(),

  items: z.array(purchaseItemSchema),
  totalAmountCents: z.number().min(0),
  status: purchaseStatusSchema.default(PURCHASE_STATUS.PENDING),

  // Deprecated fields (kept for backward compatibility if needed, or remove if safe)
  totalTickets: z.number().optional(),
  ticketType: ticketTypeSchema.optional(),

  paymentData: z.any().optional(),
  createdAt: z.date(),
  updatedAt: z.date(),
});

export const createPurchaseInputSchema = z.object({
  buyerUserId: z.string().optional(),
  guestName: z.string().optional(),
  guestContact: z.string().optional(),
  items: z.array(purchaseItemSchema).min(1),
});

export const gameTurnStatusSchema = z.enum(GAME_TURN_STATUS);

export const gameTurnCheckSchema = z.enum(GAME_TURN_CHECK);

export const gameTurnTaskTypeSchema = z.enum(GAME_TURN_TASK_TYPE);

export const gameTurnTaskStatusSchema = z.enum(GAME_TURN_TASK_STATUS);

export const gameTurnTaskSchema = z.object({
  id: z.string(),
  type: gameTurnTaskTypeSchema,
  status: gameTurnTaskStatusSchema,
  label: z.string(),
  metadata: z.record(z.string(), z.any()).optional(),
  completedAt: z.date().optional(),
});

export const gameTurnSchema = z.object({
  id: z.string(),
  purchaseId: z.string(),
  sessionId: z.string().optional(),
  leaderPlayerId: z.string(),
  gameTickets: z.array(z.string()),
  playerIds: z.array(z.string()),
  status: gameTurnStatusSchema,
  tasks: z.array(gameTurnTaskSchema),
  createdAt: z.date(),
  updatedAt: z.date(),
  startedAt: z.date().optional(),
  completedAt: z.date().optional(),
});

export const gameTurnQueueItemSchema = gameTurnSchema.extend({
  position: z.number(),
});
