import z from "zod";

export const RegisterConsoleUserSchema = z.object({
  firstName: z.string().min(2, { error: "First name is required" }),
  lastName: z.string().min(2, { error: "Last name is required" }),
  email: z.string().email({ error: "Email is required" }),
  password: z
    .union([
      z.literal(""),
      z
        .string()
        .min(6, { error: "Minimum 6 chars required for password" })
        .max(16, { error: "Max 16 chars are allowed for password" }),
    ])
    .optional(),
  username: z.string({ error: "Username is required." }),
  isSuperAdmin: z.boolean().optional(),
  roles: z
    .array(
      z.object({
        roleId: z.string({ error: "Role ID is required" }),
      }),
    )
    .optional(),
  isActive: z.boolean().optional(),
});

export const SigninConsoleUserSchema = z.object({
  email: z.string().email().optional(),
  username: z.string().optional(),
  password: z.string({ error: "Password is required" }),
  browser: z.string({ error: "Browser is required" }),
  deviceType: z.string({ error: "DeviceType is required" }),
  fcmToken: z.string({
    error: "FCM Token is required",
  }),
  ipAddress: z.string({
    error: "IP Address is required",
  }),
  location: z.string({ error: "Location is required" }),
  os: z.string({
    error: "OS is required",
  }),
});

/*
 * Only the token is required. Device fields are recorded on the session when the
 * caller can supply them, but a click from an email client has no device context to
 * offer and must not be turned away for it.
 */
export const SsoSigninConsoleUserSchema = z.object({
  token: z.string({ error: "Token is required" }),
  browser: z.string().optional(),
  deviceType: z.string().optional(),
  fcmToken: z.string().optional(),
  ipAddress: z.string().optional(),
  location: z.string().optional(),
  os: z.string().optional(),
});

export const RotateConsoleUserSessionSchema = z.object({
  browser: z.string().optional(),
  deviceType: z.string().optional(),
  fcmToken: z.string().optional(),
  ipAddress: z.string().optional(),
  location: z.string().optional(),
  os: z.string().optional(),
});

export const SearchConsoleUserSchema = z.object({
  page: z.string().optional(),
  pageSize: z.string().optional(),
  searchTerm: z.string().optional(),
  /** "true" | "false"; omitted means both. */
  isActive: z.string().optional(),
  isSuperAdmin: z.string().optional(),
  /** Comma-separated console role ids; a user matches any of them. */
  roleIds: z.string().optional(),
});

export const UpdateConsoleUserSchema = z.object({
  firstName: z.string().optional(),
  lastName: z.string().optional(),
  // email: z.email().optional(),
  // username: z.string().optional(),
  isActive: z.boolean().optional(),
  isDeleted: z.boolean().optional(),
  isSuperAdmin: z.boolean().optional(),
  password: z
    .union([
      z.literal(""),
      z
        .string()
        .min(6, { error: "Minimum 6 chars required for password" })
        .max(16, { error: "Max 16 chars are allowed for password" }),
    ])
    .optional(),
  roles: z
    .array(
      z.object({
        roleId: z.string({ error: "Role ID is required" }),
      }),
    )
    .optional(),
});

export const UpdateSuperAdminSchema = z.object({
  email: z.string({ error: "Email is required" }),
});

export const SetPasswordSchema = z.object({
  token: z.string({ error: "Token is required" }),
  password: z
    .string()
    .min(6, { error: "Minimum 6 chars required for password" })
    .max(16, { error: "Max 16 chars are allowed for password" }),
});

export const RequestPasswordResetSchema = z.object({
  email: z.string().email({ error: "Email is required" }),
});
