import { z } from 'zod';
import { USERNAME_HINT, USERNAME_MAX_LENGTH, USERNAME_PATTERN } from '../utils/usernamePolicy';

const usernameSchema = z
  .string()
  .min(1)
  .max(USERNAME_MAX_LENGTH)
  .regex(USERNAME_PATTERN, USERNAME_HINT);

export const registerSchema = z.object({
  email: z.string().email(),
  password: z.string().min(12).optional(),
  fullName: z.string().min(1).max(255),
  username: usernameSchema,
  timezone: z.string().min(1),
});

export const loginSchema = z.object({
  email: z.string().email(),
  password: z.string().min(1),
});

export const forgotPasswordSchema = z.object({
  email: z.string().email(),
});

export const resetPasswordSchema = z.object({
  token: z.string().min(1),
  password: z.string().min(12),
});

export const changePasswordSchema = z.object({
  currentPassword: z.string().min(1).optional(),
  newPassword: z.string().min(12),
});

export const updateProfileSchema = z.object({
  fullName: z.string().min(1).max(255).optional(),
  username: z
    .string()
    .optional()
    .refine((value) => value === undefined, {
      message: 'Username cannot be changed after registration.',
    }),
  timezone: z.string().min(1).optional(),
  avatarUrl: z.string().url().nullable().optional(),
  bannerUrl: z.string().url().nullable().optional(),
  logoUrl: z.string().url().nullable().optional(),
  tagline: z.string().max(255).nullable().optional(),
  headline: z.string().max(255).nullable().optional(),
  bio: z.string().max(4000).nullable().optional(),
  jobTitle: z.string().max(255).nullable().optional(),
  company: z.string().max(255).nullable().optional(),
  location: z.string().max(255).nullable().optional(),
  linkedinUrl: z.string().url().nullable().optional(),
});
