/**
 * Zod schemas for category and tag admin API routes.
 */

import { z } from 'zod';
import { isReservedSlug } from '../routing/reservedSlugs';

// ─── Slug ────────────────────────────────────────────────────────────────────

export const tagSlugSchema = z
  .string()
  .regex(/^[a-z0-9-]+$/, 'slug: lowercase letters, digits, and hyphens only')
  .max(80)
  .refine((s) => !isReservedSlug(s), { message: 'slug is reserved for routing' });

export const categorySlugSchema = tagSlugSchema;

// ─── Create category ─────────────────────────────────────────────────────────

export const createCategorySchema = z.object({
  nameHe: z.string().trim().min(1).max(100),
  nameEn: z.string().trim().min(1).max(100),
  slug: categorySlugSchema.optional(),
  sortOrder: z.number().int().min(0).max(9999).optional().default(0),
});

export type CreateCategoryBody = z.infer<typeof createCategorySchema>;

// ─── Update category ─────────────────────────────────────────────────────────

/**
 * All fields optional for partial PATCH.
 */
export const updateCategorySchema = z.object({
  nameHe: z.string().trim().min(1).max(100).optional(),
  nameEn: z.string().trim().min(1).max(100).optional(),
  slug: categorySlugSchema.optional(),
  sortOrder: z.number().int().min(0).max(9999).optional(),
  isActive: z.boolean().optional(),
});

export type UpdateCategoryBody = z.infer<typeof updateCategorySchema>;

// ─── Create tag ──────────────────────────────────────────────────────────────

export const createTagSchema = z.object({
  nameHe: z.string().trim().min(1).max(60),
  nameEn: z.string().trim().min(1).max(60),
  slug: tagSlugSchema.optional(),
  isActive: z.boolean().optional().default(true),
});

export type CreateTagBody = z.infer<typeof createTagSchema>;

// ─── Update tag ──────────────────────────────────────────────────────────────

/**
 * All fields optional for partial PATCH.
 */
export const updateTagSchema = createTagSchema.partial();

export type UpdateTagBody = z.infer<typeof updateTagSchema>;

// ─── Assign deal category ─────────────────────────────────────────────────────

export const assignDealCategorySchema = z.object({
  categoryId: z.uuid().nullable(),
  tagIds: z.array(z.uuid()),
});
