import { z } from "zod";

export const ClientDetailsSchema = z.object({
  businessNumber: z.string().trim().max(80).default(""),
  businessAddress: z.string().trim().max(500).default(""),
  contactPersonName: z.string().trim().max(120).default(""),
  contactPersonDesignation: z.string().trim().max(120).default(""),
  contactNumber: z.string().trim().max(40).default(""),
  service: z.string().trim().max(200).default(""),
  serviceCharge: z.number().min(0).default(0),
  serviceCategory: z.enum(["monthly", "yearly", "one_time"]).default("monthly"),
  logo: z.string().max(750000).default(""),
  facebookUrl: z.string().trim().max(500).default(""),
  instagramUrl: z.string().trim().max(500).default(""),
  youtubeUrl: z.string().trim().max(500).default(""),
  tiktokUrl: z.string().trim().max(500).default(""),
  googleBusinessUrl: z.string().trim().max(500).default(""),
  linkedinUrl: z.string().trim().max(500).default(""),
  onboardedById: z.string().trim().max(100).default(""),
  onboardedByName: z.string().trim().max(120).default(""),
  onboardingSource: z.enum(["meeting", "reference", "previous_client", "new_client"]).default("new_client"),
  cycleStartDate: z.string().trim().max(10).default(""),
  agreementKey: z.string().trim().max(500).default(""),
  agreementName: z.string().trim().max(255).default(""),
  agreementSize: z.number().int().min(0).default(0),
  agreementUploadedAt: z.string().trim().max(100).default(""),
});

export type ClientDetails = z.infer<typeof ClientDetailsSchema>;

export function unpackClientNotes(value: unknown): { details: ClientDetails; notes: string } {
  const empty = ClientDetailsSchema.parse({});
  if (typeof value !== "string" || !value) return { details: empty, notes: "" };
  try {
    const parsed = JSON.parse(value);
    if (parsed?.planexaClient === 1) return { details: ClientDetailsSchema.parse(parsed.details ?? {}), notes: typeof parsed.notes === "string" ? parsed.notes : "" };
  } catch { /* Existing notes are plain text. */ }
  return { details: empty, notes: value };
}

export function packClientNotes(details: ClientDetails, notes = "") {
  return JSON.stringify({ planexaClient: 1, details, notes });
}

export function expandClient<T extends { notes?: unknown }>(row: T) {
  const unpacked = unpackClientNotes(row.notes);
  return { ...row, notes: unpacked.notes, ...unpacked.details };
}
