import { z } from 'zod';

export const reminderPreferencesSchema = z.object({
  delivery: z.enum(['immediate', 'daily', 'weekly', 'off']).default('immediate'),
  digestTime: z
    .string()
    .regex(/^([01]\d|2[0-3]):[0-5]\d$/, 'Must be HH:MM')
    .optional(),
  digestDayOfWeek: z.number().int().min(0).max(6).optional(),
  timezone: z.string().min(1).max(64).optional(),
});

export const updateUserPreferencesSchema = z.object({
  locale: z.string().optional(),
  timezone: z.string().optional(),
  reminders: reminderPreferencesSchema.optional(),
  /**
   * Widget id → visible flag. Persists which dashboard cards the user
   * wants to see; missing ids fall back to registry defaults. Kept loose
   * (record-of-bool) so adding a new widget doesn't require a validator
   * update.
   */
  dashboardWidgets: z.record(z.string(), z.boolean()).optional(),
  /**
   * Rep-chosen dashboard widget order for the **desktop / xl layout**
   * (>= 1280px). Missing ids fall through to registry order so newly-
   * added widgets always surface.
   */
  dashboardWidgetOrder: z.array(z.string()).optional(),
  /**
   * Rep-chosen dashboard widget order for the **stacked layout**
   * (< 1280px - single column on tablet/mobile). When unset, the
   * dashboard falls back to `dashboardWidgetOrder` (then registry
   * order).
   */
  dashboardWidgetOrderMobile: z.array(z.string()).optional(),
});

export type UpdateUserPreferencesInput = z.infer<typeof updateUserPreferencesSchema>;
export type ReminderPreferences = z.infer<typeof reminderPreferencesSchema>;
