/**
 * Request schemas for /admin/users/* (PLANNING.md §4b). Create takes the
 * initial password directly — the superadmin sets it in the form — so the new
 * account is usable immediately, no invite email or token step.
 */
import { z } from 'zod';

const role = z.enum(['superadmin', 'admin']);
const status = z.enum(['active', 'inactive']);

export const listQuerySchema = z.object({
  q: z.string().trim().min(1).max(100).optional(),
  status: status.optional(),
  role: role.optional(),
  page: z.coerce.number().int().min(1).default(1),
  perPage: z.coerce.number().int().min(1).max(100).default(20),
  sort: z.enum(['newest', 'oldest']).default('newest'),
});

export const createUserSchema = z.object({
  name: z.string().trim().min(1).max(120),
  phone: z.string().trim().min(3).max(32),
  email: z.string().trim().email().max(254),
  role: role.default('admin'),
  password: z.string().min(8).max(128),
});

export const updateUserSchema = z
  .object({
    name: z.string().trim().min(1).max(120).optional(),
    email: z.string().trim().email().max(254).optional(),
    phone: z.string().trim().min(3).max(32).optional(),
    role: role.optional(),
    status: status.optional(),
  })
  .refine((v) => Object.keys(v).length > 0, { message: 'No fields to update' });

/**
 * POST /admin/users/:id/password. Self-service (own id) requires both fields;
 * superadmin force-reset (another id) takes neither — it emails a reset link.
 * The service enforces which mode applies.
 */
export const changePasswordSchema = z.object({
  currentPassword: z.string().min(1).max(200).optional(),
  newPassword: z.string().min(8).max(128).optional(),
});

export type ListQuery = z.infer<typeof listQuerySchema>;
export type CreateUserInput = z.infer<typeof createUserSchema>;
export type UpdateUserInput = z.infer<typeof updateUserSchema>;
export type ChangePasswordInput = z.infer<typeof changePasswordSchema>;
