import { z } from 'zod';
import { paginatedResponseSchema } from '../pagination';
import { JOIN_REQUEST_STATUS, RACING_TEAM_ROLE } from './RacingTeam.const';
import { playerSchema } from '../player/Player.schema';

// --- Team Schemas ---

export const racingTeamSchema = z.object({
  id: z.string(),
  name: z.string().min(3).max(50),
  imageUrl: z.url().optional(),
  adminUserId: z.string(),
  createdAt: z.date(),
  updatedAt: z.date(),
});

export const createRacingTeamSchema = racingTeamSchema.omit({
  id: true,
  createdAt: true,
  updatedAt: true,
  adminUserId: true,
});

export const updateRacingTeamSchema = racingTeamSchema.partial();

export const filterRacingTeamSchema = z.object({
  name: z.string().optional(),
  adminUserId: z.string().optional(),
  page: z.coerce.number().min(1).default(1),
  limit: z.coerce.number().min(1).max(100).default(10),
  cursor: z.string().optional(),
});

export const racingTeamSummarySchema = racingTeamSchema.pick({
  id: true,
  name: true,
  imageUrl: true,
});

export const paginatedRacingTeamSchema = paginatedResponseSchema(racingTeamSchema);
export const paginatedRacingTeamSummarySchema = paginatedResponseSchema(racingTeamSummarySchema);

// --- Membership Schemas ---

export const joinRequestSchema = z.object({
  id: z.string(),
  racingTeamId: z.string(),
  playerId: z.string(),
  status: z.enum(JOIN_REQUEST_STATUS),
  createdAt: z.date(),
  updatedAt: z.date(),
});

export const teamMemberSchema = z.object({
  id: z.string(),
  racingTeamId: z.string(),
  playerId: z.string(),
  role: z.enum(RACING_TEAM_ROLE),
  joinedAt: z.date(),
});

export const teamMemberWithPlayerSchema = playerSchema.extend({
  role: z.enum(RACING_TEAM_ROLE),
  joinedAt: z.date(),
});

export const racingTeamWithMembersSchema = racingTeamSchema.extend({
  members: z.array(teamMemberWithPlayerSchema),
});

export const createJoinRequestSchema = z.object({
  racingTeamId: z.string(),
  playerId: z.string(),
});

export const answerJoinRequestSchema = z.object({
  racingTeamId: z.string(),
  targetPlayerId: z.string(),
  accepted: z.boolean(),
});

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