import { z } from "zod";

const positiveId = z.coerce.number().int().positive();

export const clientReviewIdParamSchema = z.object({
  id: positiveId,
});

export const clientReviewListQuerySchema = z.object({
  q: z.string().trim().min(1).max(255).optional(),
  page: z.coerce.number().int().min(1).default(1),
  perPage: z.coerce.number().int().min(1).max(100).default(20),
  includeInactive: z.preprocess((value) => {
    if (value === undefined) return undefined;
    if (typeof value === "boolean") return value;
    if (typeof value === "string") {
      if (["true", "1", "yes"].includes(value.toLowerCase())) return true;
      if (["false", "0", "no"].includes(value.toLowerCase())) return false;
    }
    return value;
  }, z.boolean().optional()),
});

const mediaInputSchema = z.object({
  url: z.string().trim().min(1).max(512),
  storageKey: z.string().trim().max(1024).nullable().optional(),
  fileName: z.string().trim().max(255).nullable().optional(),
  mimeType: z.string().trim().max(120).nullable().optional(),
  sizeBytes: z.coerce.number().int().min(0).nullable().optional(),
  altText: z.string().trim().max(255).nullable().optional(),
  sortOrder: z.coerce.number().int().min(0).default(0),
  isPrimary: z.boolean().default(false),
});

export const createClientReviewSchema = z.object({
  clientName: z.string().trim().min(1).max(255),
  reviewText: z.string().trim().min(1),
  postUrl: z.string().trim().url().max(1024).nullable().optional(),
  starRating: z.number().int().min(1).max(5).default(5),
  sortOrder: z.number().int().min(0).default(0),
  media: z.array(mediaInputSchema).default([]),
});

export const updateClientReviewSchema = z
  .object({
    clientName: z.string().trim().min(1).max(255).optional(),
    reviewText: z.string().trim().min(1).optional(),
    postUrl: z.string().trim().url().max(1024).nullable().optional(),
    starRating: z.number().int().min(1).max(5).optional(),
    sortOrder: z.number().int().min(0).optional(),
    isActive: z.boolean().optional(),
    media: z.array(mediaInputSchema).optional(),
  })
  .refine(
    (value) => Object.keys(value).length > 0,
    "At least one field is required",
  );
