import { z } from "zod";

export const LoginSchema = z.object({
  username: z.string().min(1, "Uživatelské jméno je povinné").max(255),
  password: z.string().min(1, "Heslo je povinné").max(200),
  remember_me: z.boolean().optional().default(false),
});

export const TotpVerifySchema = z.object({
  login_token: z.string().min(1, "Token je povinný"),
  totp_code: z
    .string()
    .length(6, "Kód musí mít 6 číslic")
    .regex(/^\d{6}$/, "Kód musí mít 6 číslic"),
  remember_me: z.boolean().optional().default(false),
});

export const TotpBackupSchema = z.object({
  login_token: z.string().min(1, "Token je povinný"),
  backup_code: z
    .string()
    .min(1, "Záložní kód je povinný")
    // Cap length so a request with bodyLimit=10KB can't trigger N×bcrypt on
    // a multi-KB string. Real backup codes are 8-16 chars; 64 is generous.
    .max(64, "Záložní kód je příliš dlouhý"),
  remember_me: z.boolean().optional().default(false),
});

export const TotpEnableSchema = z.object({
  secret: z.string().min(1).max(255),
  code: z.string().min(1).max(64),
  password: z.string().max(200).optional(),
  current_code: z.string().max(64).optional(),
});

export const TotpDisableSchema = z.object({
  code: z.string().min(1).max(64),
  password: z.string().max(200).optional(),
});

export const TotpRequiredSchema = z.object({
  required: z.boolean(),
});

export type LoginInput = z.infer<typeof LoginSchema>;
export type TotpVerifyInput = z.infer<typeof TotpVerifySchema>;
export type TotpBackupInput = z.infer<typeof TotpBackupSchema>;
