import { z } from "zod";
import { isValidTenantSlug, normalizeSlug } from "@/core/tenant/slug";

export const emailSchema = z.string().trim().email().max(320);

export const passwordSchema = z
  .string()
  .min(12, "Password must be at least 12 characters")
  .max(128);

export const tenantSlugSchema = z
  .string()
  .trim()
  .transform(normalizeSlug)
  .refine(isValidTenantSlug, "Invalid or reserved slug");

export const createTenantSchema = z.object({
  studioName: z.string().trim().min(2).max(120),
  slug: tenantSlugSchema.optional(),
});

export const createProjectSchema = z.object({
  title: z.string().trim().min(2).max(200),
  slug: z.string().trim().min(2).max(200).optional(),
  description: z.string().max(20000).optional(),
  location: z.string().max(200).optional(),
  year: z.number().int().min(1800).max(2100).optional(),
  area: z.string().max(100).optional(),
  clientName: z.string().max(200).optional(),
  architectCredit: z.string().max(200).optional(),
  projectType: z.string().max(120).optional(),
  categoryId: z.string().uuid().optional().nullable(),
  concept: z.string().max(50000).optional(),
  designProcess: z.string().max(50000).optional(),
  materials: z.string().max(20000).optional(),
  videoUrl: z.string().max(500).optional(),
  isFeatured3d: z.boolean().optional(),
  seoTitle: z.string().max(120).optional(),
  seoDescription: z.string().max(320).optional(),
});

export const publishProjectSchema = z.object({
  projectId: z.string().uuid(),
});

export const createInquirySchema = z.object({
  name: z.string().trim().min(2).max(120),
  email: emailSchema,
  phone: z.string().trim().max(40).optional(),
  projectType: z.string().trim().max(120).optional(),
  budget: z.string().trim().max(120).optional(),
  location: z.string().trim().max(200).optional(),
  timeline: z.string().trim().max(120).optional(),
  projectSize: z.string().trim().max(120).optional(),
  message: z.string().trim().min(10).max(5000),
});

export const addCustomDomainSchema = z.object({
  domain: z
    .string()
    .trim()
    .toLowerCase()
    .max(253)
    .regex(
      /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/,
      "Invalid domain",
    ),
});

export const registerSchema = z.object({
  name: z.string().trim().min(2).max(120),
  email: emailSchema,
  password: passwordSchema,
  studioName: z.string().trim().min(2).max(120),
  slug: tenantSlugSchema.optional(),
});

export const updateProfileSchema = z.object({
  studioName: z.string().trim().min(2).max(120),
  description: z.string().max(5000).optional(),
  tagline: z.string().max(240).optional(),
  about: z.string().max(20000).optional(),
  architectName: z.string().max(160).optional(),
  architectTitle: z.string().max(160).optional(),
  philosophy: z.string().max(20000).optional(),
  vision: z.string().max(20000).optional(),
  mission: z.string().max(20000).optional(),
  approach: z.string().max(20000).optional(),
  designPrinciples: z.string().max(20000).optional(),
  experience: z.string().max(20000).optional(),
  studioCulture: z.string().max(20000).optional(),
  workspace: z.string().max(20000).optional(),
  methodology: z.string().max(20000).optional(),
  collaborations: z.string().max(20000).optional(),
  location: z.string().max(200).optional(),
  foundedYear: z.number().int().min(1800).max(2100).optional().nullable(),
  websiteUrl: z.string().url().max(500).optional().or(z.literal("")),
  publicEmail: z.string().email().max(320).optional().or(z.literal("")),
  phone: z.string().max(40).optional(),
  whatsapp: z.string().max(40).optional(),
  businessHours: z.string().max(500).optional(),
  mapEmbedUrl: z.string().max(2000).optional(),
  socialInstagram: z.string().max(500).optional(),
  socialLinkedin: z.string().max(500).optional(),
  socialX: z.string().max(500).optional(),
  seoTitle: z.string().max(120).optional(),
  seoDescription: z.string().max(320).optional(),
});

export const createServiceSchema = z.object({
  title: z.string().trim().min(2).max(200),
  slug: z.string().trim().min(2).max(200).optional(),
  description: z.string().max(10000).optional(),
  sortOrder: z.number().int().min(0).max(9999).optional(),
  isPublished: z.boolean().optional(),
});

export const createCategorySchema = z.object({
  name: z.string().trim().min(2).max(120),
  slug: z.string().trim().min(2).max(120).optional(),
  description: z.string().max(2000).optional(),
  sortOrder: z.number().int().min(0).max(9999).optional(),
});

export const createJournalSchema = z.object({
  title: z.string().trim().min(2).max(200),
  slug: z.string().trim().min(2).max(200).optional(),
  excerpt: z.string().max(1000).optional(),
  content: z.string().max(100000).optional(),
  seoTitle: z.string().max(120).optional(),
  seoDescription: z.string().max(320).optional(),
});

export const updateMediaAltSchema = z.object({
  altText: z.string().max(500).optional(),
});

export const updateAccountProfileSchema = z.object({
  name: z.string().trim().min(2).max(120),
  phone: z
    .string()
    .trim()
    .max(40)
    .optional()
    .transform((value) => value || ""),
});

export const requestEmailChangeSchema = z.object({
  newEmail: emailSchema,
  currentPassword: passwordSchema,
});
