import { emailField } from "@/schema/common.schema";
import * as z from "zod";

export const userFormSchema = z.object({
  firstName: z
    .string()
    .min(2, { message: "First name must be at least 2 characters" })
    .max(50, { message: "First name must be less than 50 characters" }),
  lastName: z
    .string()
    .min(2, { message: "Last name must be at least 2 characters" })
    .max(50, { message: "Last name must be less than 50 characters" }),
  email: emailField(),
  // PhoneInputIntl stores { number, countryCode, dialCode, e164 }
  phone: z
    .union([
      z.undefined(),
      z.object({
        number: z.string(),
        countryCode: z.string().optional(),
        dialCode: z.union([z.string(), z.number()]).optional(),
        e164: z.string().optional(),
      }),
    ])
    .refine((val) => val != null, { message: "Phone number is required" })
    .refine(
      (val) => {
        if (val == null) return true;
        const digits = (val.number ?? "").replace(/\D/g, "");
        return digits.length >= 6 && digits.length <= 15;
      },
      { message: "Enter a valid phone number (6–15 digits)" },
    ),
  role: z.string().min(1, "Role is required"),
  team: z.string().optional(),
  reportingTo: z.string().optional(),
  memberType: z.enum(["internal", "external"], {
    required_error: "Please select member type",
  }),
  joinDate: z.union([z.string(), z.date()]).optional(),
});

export const userViewFormSchema = z.object({
  firstName: z
    .string()
    .min(2, { message: "First name must be at least 2 characters" })
    .max(50, { message: "First name must be less than 50 characters" }),
  lastName: z
    .string()
    .min(2, { message: "Last name must be at least 2 characters" })
    .max(50, { message: "Last name must be less than 50 characters" }),
  email: emailField(),
  phone: z.coerce
    .string()
    .optional()
    .refine((val) => val === undefined || /^\d{10}$/.test(val), {
      message: "Phone number must be exactly 10 digits",
    }),
  memberType: z.enum(["internal", "external"], {
    required_error: "Please select member type",
  }),
  status: z.enum(["active", "inActive", "pending"], {
    required_error: "Please select status",
  }),
});
