/**
 * اسکیماهای اعتبارسنجی مشترک بین فرم‌ها (کلاینت) و سرور.
 * ورودی‌ها قبل از بررسی یکسان‌سازی می‌شوند (ارقام فارسی ← لاتین، حذف فاصله‌ها).
 */
import { z } from "zod";
import { toLatinDigits } from "@/lib/persian";

const digitsOnly = (s: string) => toLatinDigits(s).replace(/[\s-]/g, "");

/** شماره موبایل ایران: 09xxxxxxxxx (+98 و 0098 هم پذیرفته و تبدیل می‌شود) */
export const mobileSchema = z
  .string()
  .transform((s) => digitsOnly(s).replace(/^(\+98|0098|98)/, "0"))
  .refine((s) => /^09\d{9}$/.test(s), "شماره موبایل معتبر نیست؛ مثال: ۰۹۱۲۳۴۵۶۷۸۹");

export const otpSchema = z
  .string()
  .transform(digitsOnly)
  .refine((s) => /^\d{5}$/.test(s), "کد تأیید ۵ رقمی است");

export const postalCodeSchema = z
  .string()
  .transform(digitsOnly)
  .refine((s) => /^\d{10}$/.test(s), "کد پستی باید ۱۰ رقم باشد");

const persianText = (label: string, min: number, max: number) =>
  z
    .string()
    .trim()
    .min(min, `${label} را وارد کنید`)
    .max(max, `${label} حداکثر ${max} کاراکتر است`)
    .refine((s) => !/[<>]/.test(s), `${label} شامل کاراکتر غیرمجاز است`);

export const addressSchema = z.object({
  title: persianText("عنوان آدرس", 2, 30),
  receiver: persianText("نام گیرنده", 3, 60),
  phone: mobileSchema,
  province: z.string().min(1, "استان را انتخاب کنید"),
  city: z.string().min(1, "شهر را انتخاب کنید"),
  line: persianText("نشانی", 10, 250),
  postalCode: postalCodeSchema,
});

export type AddressInput = z.input<typeof addressSchema>;

export const contactSchema = z.object({
  name: persianText("نام", 2, 60),
  phone: mobileSchema,
  message: persianText("متن پیام", 10, 1000),
});

/** کد تخفیف: فقط حروف لاتین و عدد */
export const discountCodeSchema = z
  .string()
  .trim()
  .toUpperCase()
  .regex(/^[A-Z0-9]{3,20}$/, "کد تخفیف معتبر نیست");

/** اولین پیام خطای هر فیلد از نتیجه safeParse */
export function fieldErrors(error: z.ZodError): Record<string, string> {
  const out: Record<string, string> = {};
  for (const issue of error.issues) {
    const key = String(issue.path[0] ?? "_");
    out[key] ??= issue.message;
  }
  return out;
}

/** نظر کاربر درباره محصول */
export const reviewSchema = z.object({
  rating: z.number().int().min(1, "امتیاز را انتخاب کنید").max(5),
  title: z.string().trim().min(3, "عنوان کوتاه است").max(80).refine((s) => !/[<>]/.test(s), "کاراکتر غیرمجاز"),
  body: z.string().trim().min(10, "متن نظر حداقل ۱۰ کاراکتر باشد").max(1000).refine((s) => !/[<>]/.test(s), "کاراکتر غیرمجاز"),
});

export const nameSchema = z.string().trim().min(2, "نام حداقل ۲ کاراکتر است").max(60).refine((s) => !/[<>]/.test(s), "کاراکتر غیرمجاز");
