import { z } from "zod";

const userStatusSchema = z.union([
  z.literal("active"),
  z.literal("inactive"),
  z.literal("suspended"),
]);
const noSpacesRegex = /^\S*$/;
const usernameRegex = /^[a-zA-Z0-9_]+$/;

export type UserStatus = z.infer<typeof userStatusSchema>;

const userRoleSchema = z.union([
  z.literal("developer"),
  z.literal("admin"),
  z.literal("project_manager"),
  z.literal("content_writer"),
  z.literal("web_user"),
]);
const userPremiumSchema = z.union([
  z.literal("logged_in"),
  z.literal("guest"),
  z.literal("premium"),
]);
export const userSchema = z
  .object({
    firstName: z.string().min(1, "First name is required"),
    lastName: z.string().min(1, "Last name is required"),
    username: z
      .string()
      .min(1, "Username is required")
      .regex(
        usernameRegex,
        "Username must not contain spaces or special characters"
      ),
    email: z.string().min(1, "Email is required").email("Invalid email format"),
    password: z
      .string()
      .min(1, "Password is required")
      .regex(noSpacesRegex, "Password must not contain spaces"),
    confirm_password: z
      .string()
      .min(1, "Confirm password is required")
      .regex(noSpacesRegex, "Confirm password must not contain spaces"),
    stripe_id: z.string().optional(),
    is_premium: userPremiumSchema,
    status: userStatusSchema,
    role: userRoleSchema,
  })
  .refine((data) => data.password === data.confirm_password, {
    message: "Passwords do not match",
    path: ["confirm_password"], // show error under `confirm_password` field
  });
export const userSchemaEdit = z
  .object({
    firstName: z.string().min(1, "First name is required"),
    lastName: z.string().min(1, "Last name is required"),
    username: z
      .string()
      .min(1, "Username is required")
      .regex(
        usernameRegex,
        "Username must not contain spaces or special characters"
      ),
    email: z.string().min(1, "Email is required").email("Invalid email format"),
    password: z
      .string()
      .min(1, "Password is required")
      .regex(noSpacesRegex, "Password must not contain spaces")
      .optional(),
    confirm_password: z
      .string()
      .min(1, "Confirm password is required")
      .regex(noSpacesRegex, "Confirm password must not contain spaces")
      .optional(),
    stripe_id: z.string().optional(),
    is_premium: userPremiumSchema,
    status: userStatusSchema,
    role: userRoleSchema,
  })
  .superRefine((data, ctx) => {
    if (data.password || data.confirm_password) {
      if (data.password !== data.confirm_password) {
        ctx.addIssue({
          code: "custom",
          path: ["confirm_password"],
          message: "Passwords do not match",
        });
      }
    }
  });

export type UserForm = z.infer<typeof userSchema>;
export type UserFormEdit = z.infer<typeof userSchemaEdit>;
