type RawRecord = Record<string, unknown>;

export type CatalogStoryGroup = {
  id: string;
  title: string;
  thumbnail_url: string | null;
  items: Array<{
    id: string;
    image_url: string;
    product_id?: string | null;
    product?: {
      id: string;
      name: string;
      price: number;
      price_on_request: boolean;
      image_url?: string;
    };
  }>;
};

function toRecord(input: unknown): RawRecord | null {
  if (!input || typeof input !== "object") return null;
  return input as RawRecord;
}

function normalizeStoryProduct(input: unknown): CatalogStoryGroup["items"][number]["product"] | undefined {
  const candidate = Array.isArray(input) ? input[0] : input;
  const record = toRecord(candidate);
  if (!record) return undefined;

  const id = typeof record.id === "string" ? record.id : "";
  const name = typeof record.name === "string" ? record.name : "";
  if (!id || !name) return undefined;

  const price = Number(record.price);

  return {
    id,
    name,
    price: Number.isFinite(price) ? price : 0,
    price_on_request: Boolean(record.price_on_request),
    image_url: typeof record.image_url === "string" ? record.image_url : undefined,
  };
}

export function normalizeStoriesGroups(input: unknown): CatalogStoryGroup[] {
  if (!Array.isArray(input)) return [];

  return input.map((groupRaw, groupIndex) => {
    const group = toRecord(groupRaw) || {};
    const groupId = typeof group.id === "string" ? group.id : `story-group-${groupIndex}`;
    const rawItems = Array.isArray(group.items) ? group.items : [];

    const items: CatalogStoryGroup["items"] = [];
    rawItems.forEach((itemRaw, itemIndex) => {
      const item = toRecord(itemRaw);
      if (!item) return;
      const imageUrl = typeof item.image_url === "string" ? item.image_url : "";
      if (!imageUrl) return;
      items.push({
        id: typeof item.id === "string" ? item.id : `${groupId}-item-${itemIndex}`,
        image_url: imageUrl,
        product_id: typeof item.product_id === "string" ? item.product_id : null,
        product: normalizeStoryProduct(item.product),
      });
    });

    return {
      id: groupId,
      title: typeof group.title === "string" ? group.title : "Stories",
      thumbnail_url: typeof group.thumbnail_url === "string" ? group.thumbnail_url : null,
      items,
    };
  });
}
