import { shopProducts } from "@/data/shop";

export const cartAssets = {
  ratingIcon: "/assets/images/icon/rating2.svg",
  ratingAlt: "Star rating",
  removeIcon: "/assets/images/icon/remove.svg",
  arrowIcon: "/assets/images/icon/arrow.svg",
  arrowAltApply: "Arrow Icon for Apply Coupon",
  arrowAltUpdate: "Arrow Icon for Update Cart",
  arrowAltCheckout: "Arrow Icon for Checkout",
} as const;

export type CartProduct = {
  id: string;
  title: string;
  titleHeading: "h2" | "h3";
  href: string;
  imageSrc: string;
  imageAlt: string;
  imageWidth: number;
  imageHeight: number;
  /** Unit price in dollars (e.g. 180 for $180). */
  unitPrice: number;
  rating: number;
  reviewCountLabel: string;
};

export const cartProducts: CartProduct[] = [
  {
    id: "brown-travel-suitcase-premium",
    title: "Brown Travel Suitcase",
    titleHeading: "h2",
    href: "#",
    imageSrc: "/assets/images/event/cart1.png",
    imageAlt: "Brown Travel Suitcase",
    imageWidth: 120,
    imageHeight: 120,
    unitPrice: 180,
    rating: 5,
    reviewCountLabel: "(10)",
  },
  {
    id: "black-travel-suitcase",
    title: "Black Travel Suitcase",
    titleHeading: "h3",
    href: "#",
    imageSrc: "/assets/images/event/cart2.png",
    imageAlt: "Black Travel Suitcase",
    imageWidth: 120,
    imageHeight: 120,
    unitPrice: 120,
    rating: 5,
    reviewCountLabel: "(10)",
  },
  {
    id: "brown-travel-suitcase-standard",
    title: "Brown Travel Suitcase",
    titleHeading: "h3",
    href: "#",
    imageSrc: "/assets/images/event/cart3.png",
    imageAlt: "Brown Travel Suitcase",
    imageWidth: 120,
    imageHeight: 120,
    unitPrice: 150,
    rating: 5,
    reviewCountLabel: "(10)",
  },
];

export type CartLineSeed = {
  productId: string;
  quantity: number;
};

/** Initial rows shown on first load (matches previous static markup). */
export const initialCartLines: CartLineSeed[] = [
  { productId: "brown-travel-suitcase-premium", quantity: 1 },
  { productId: "black-travel-suitcase", quantity: 1 },
  { productId: "brown-travel-suitcase-standard", quantity: 1 },
];

export type CartLine = {
  productId: string;
  quantity: number;
};

/** Browser key for persisted cart line items (quantities + removals). */
export const cartLocalStorageKey = "sasico-cart-lines-v1";

const CART_QTY_MIN = 1;
const CART_QTY_MAX = 99;

/**
 * Parses JSON from localStorage into cart lines. Unknown product ids are dropped.
 * Returns `null` if the payload is not a valid array (caller keeps default state).
 */
export function parseStoredCartLines(data: unknown): CartLine[] | null {
  if (!Array.isArray(data)) return null;

  const known = new Set([
    ...cartProducts.map((p) => p.id),
    ...shopProducts.map((p) => p.id),
  ]);
  const merged = new Map<string, number>();

  for (const item of data) {
    if (!item || typeof item !== "object") continue;
    const rec = item as Record<string, unknown>;
    const productId = rec.productId;
    const quantity = rec.quantity;
    if (typeof productId !== "string" || !known.has(productId)) continue;

    let q: number;
    if (typeof quantity === "number" && Number.isFinite(quantity)) {
      q = quantity;
    } else if (typeof quantity === "string") {
      q = Number.parseInt(quantity, 10);
    } else {
      continue;
    }
    if (!Number.isFinite(q)) continue;
    q = Math.floor(q);
    q = Math.min(CART_QTY_MAX, Math.max(CART_QTY_MIN, q));

    const prev = merged.get(productId) ?? 0;
    merged.set(productId, Math.min(CART_QTY_MAX, prev + q));
  }

  return Array.from(merged, ([productId, quantity]) => ({
    productId,
    quantity,
  }));
}

export const cartTotalsCopy = {
  sectionTitle: "Subtotal",
  description:
    "Travel in style and confidence with our premium Black Travel Suitcase Designed elegance.",
  tableSubtotal: "Subtotal",
  tableShipping: "Shipping",
  tableTotal: "Total",
} as const;

/** Flat shipping in dollars when the cart has at least one line. */
export const cartShippingAmount = 18;

export const cartCouponForm = {
  label: "Coupon:",
  name: "coupan",
  placeholder: "Enter coupon code",
  applyLabel: "Apply Code",
} as const;
