import { z } from "zod";
import { EntityId, User } from "./entities";

export const SignupRequest = z.object({
  email: z.string().email(),
  password: z.string().min(8).max(200),
  name: z.string().min(1).max(120),
});
export type SignupRequest = z.infer<typeof SignupRequest>;

export const SignupResponse = z.object({
  userId: z.string(),
  verificationLink: z.string(),
});
export type SignupResponse = z.infer<typeof SignupResponse>;

export const VerifyEmailRequest = z.object({ token: z.string().min(1) });

export const LoginRequest = z.object({
  email: z.string().email(),
  password: z.string().min(1),
  deviceLabel: z.string().max(200).optional(),
});
export type LoginRequest = z.infer<typeof LoginRequest>;

export const AuthTokens = z.object({
  accessToken: z.string(),
  refreshToken: z.string(),
  expiresIn: z.number().int().positive(),
});
export type AuthTokens = z.infer<typeof AuthTokens>;

export const AuthSession = z.object({
  user: User,
  tokens: AuthTokens,
});
export type AuthSession = z.infer<typeof AuthSession>;

export const RefreshRequest = z.object({ refreshToken: z.string().min(1) });

export const RequestMagicLinkRequest = z.object({ email: z.string().email() });
export const ConsumeMagicLinkRequest = z.object({ token: z.string().min(1) });

export const RequestPasswordResetRequest = z.object({ email: z.string().email() });
export const ConfirmPasswordResetRequest = z.object({
  token: z.string().min(1),
  newPassword: z.string().min(8).max(200),
});

export const DeviceSession = z.object({
  id: EntityId,
  deviceLabel: z.string().nullable(),
  ip: z.string().nullable(),
  userAgent: z.string().nullable(),
  createdAt: z.string().datetime(),
  isCurrent: z.boolean(),
});
export type DeviceSession = z.infer<typeof DeviceSession>;

export const DeviceListResponse = z.object({ sessions: z.array(DeviceSession) });
