/**
 * Request schemas for /admin/media/* (PLANNING.md §4b). Upload fields arrive as
 * multipart text parts (all strings) so this schema coerces/trims accordingly.
 */
import { z } from 'zod';

const page = z.enum(['genesis', 'hive']);

/** `?page=…&category=…&visible=0|1` */
export const listQuerySchema = z.object({
  page,
  category: z.string().trim().min(1).optional(),
  visible: z
    .enum(['0', '1', 'true', 'false'])
    .transform((v) => v === '1' || v === 'true')
    .optional(),
});

/** multipart text fields on POST /admin/media */
export const uploadFieldsSchema = z.object({
  page,
  category: z.string().trim().min(1).optional(),
  alt: z.string().trim().min(1).max(255),
  caption: z.string().trim().max(500).optional(),
});

/** PATCH /admin/media/:id — at least one field */
export const updateImageSchema = z
  .object({
    alt: z.string().trim().min(1).max(255).optional(),
    caption: z.string().trim().max(500).nullable().optional(),
    category: z.string().trim().min(1).nullable().optional(),
  })
  .refine((v) => Object.keys(v).length > 0, { message: 'No fields to update' });

/** PATCH /admin/media/:id/visibility */
export const visibilitySchema = z.object({
  isVisible: z.boolean(),
});

/** PATCH /admin/media/order — the COMPLETE ordered id list for the page (§6c) */
export const reorderSchema = z.object({
  page,
  ids: z.array(z.string().min(1)).min(1),
});

export type ListQuery = z.infer<typeof listQuerySchema>;
export type UploadFields = z.infer<typeof uploadFieldsSchema>;
export type UpdateImageInput = z.infer<typeof updateImageSchema>;
export type ReorderInput = z.infer<typeof reorderSchema>;
