export type ProductCustomFieldType = "text" | "textarea" | "number";

export type ProductCustomFieldConfig = {
  id: string;
  title: string;
  field_type: ProductCustomFieldType;
  placeholder: string | null;
  required: boolean;
  variation_signature: string | null;
  position: number;
  active: boolean;
};

const FIELD_TYPES: ProductCustomFieldType[] = ["text", "textarea", "number"];

function isUuid(value: string) {
  return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
}

function randomId() {
  if (typeof globalThis.crypto?.randomUUID === "function") {
    return globalThis.crypto.randomUUID();
  }
  return `cf_${Date.now()}_${Math.random().toString(16).slice(2, 10)}`;
}

function normalizeSignature(value: unknown) {
  const raw = typeof value === "string" ? value.trim() : "";
  return raw || null;
}

export function variationSignatureFromCombination(combination: Record<string, string> | null | undefined) {
  if (!combination || typeof combination !== "object") return "";
  return Object.entries(combination)
    .map(([key, value]) => [String(key || "").trim().toLowerCase(), String(value || "").trim().toLowerCase()] as const)
    .filter(([key, value]) => Boolean(key) && Boolean(value))
    .sort((a, b) => a[0].localeCompare(b[0]))
    .map(([key, value]) => `${key}:${value}`)
    .join("|");
}

export function normalizeProductCustomFieldsConfig(value: unknown): ProductCustomFieldConfig[] {
  if (!Array.isArray(value)) return [];
  return value
    .map((item, index) => {
      if (!item || typeof item !== "object" || Array.isArray(item)) return null;
      const row = item as Record<string, unknown>;
      const title = typeof row.title === "string" ? row.title.trim() : "";
      if (!title) return null;
      const fieldType = FIELD_TYPES.includes(row.field_type as ProductCustomFieldType)
        ? (row.field_type as ProductCustomFieldType)
        : "text";
      const position = Number.isFinite(Number(row.position)) ? Number(row.position) : index;
      const id = typeof row.id === "string" && isUuid(row.id) ? row.id : randomId();
      const placeholderRaw = typeof row.placeholder === "string" ? row.placeholder.trim() : "";
      return {
        id,
        title,
        field_type: fieldType,
        placeholder: placeholderRaw || null,
        required: Boolean(row.required),
        variation_signature: normalizeSignature(row.variation_signature),
        position,
        active: row.active !== false,
      } satisfies ProductCustomFieldConfig;
    })
    .filter((item): item is ProductCustomFieldConfig => Boolean(item))
    .sort((a, b) => a.position - b.position)
    .map((item, index) => ({ ...item, position: index }));
}
