"use client";

import { useEffect, useMemo, useState } from "react";
import Link from "next/link";
import { useParams, useRouter, useSearchParams } from "next/navigation";
import { CATEGORIES } from "@/data/gunbuilderParts";
import type { CategoryId, Part } from "@/types/gunbuilder";


type ViewMode = "card" | "list";

type GunbuilderProductFromApi = {
  id: number;
  name: string;
  brand: string;
  platform: string;
  partRole: string;
  price: number | null;
  imageUrl: string | null;
  buyUrl: string | null;
  inStock?: boolean | null;
};

type UiPart = Part & {
  // local-only stock flag for filtering
  inStock?: boolean;
};

const PLATFORMS = ["AR-15", "AR-10"];

const API_BASE_URL =
  process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8080";


// sort options
type SortOption = "relevance" | "price-asc" | "price-desc" | "brand-asc";

// build state type + storage key (matches /gunbuilder)
type BuildState = Partial<Record<CategoryId, string>>;
const STORAGE_KEY = "gunbuilder-build-state";

// support for url id-slug
const slugify = (str: string) =>
  str
    .toLowerCase()
    .replace(/[^a-z0-9]+/g, "-")
    .replace(/(^-|-$)/g, "");

export default function CategoryPage() {
  const params = useParams();
  const categoryId = params.categoryId as CategoryId;
  const router = useRouter();
  const searchParams = useSearchParams();

  const [viewMode, setViewMode] = useState<ViewMode>("list");
  const [parts, setParts] = useState<UiPart[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  // filter + sort state
  const [brandFilter, setBrandFilter] = useState<string[]>([]);
  const [sortBy, setSortBy] = useState<SortOption>("relevance");
  const [searchQuery, setSearchQuery] = useState<string>("");
  const [priceRange, setPriceRange] = useState<{ min: number | null; max: number | null }>({
    min: null,
    max: null,
  });
  const [inStockOnly, setInStockOnly] = useState<boolean>(false);
  const [currentPage, setCurrentPage] = useState<number>(1);
  const PAGE_SIZE = 24;

  //  build state for this page, synced with localStorage
  const [build, setBuild] = useState<BuildState>(() => {
    if (typeof window === "undefined") return {};
    try {
      const stored = window.localStorage.getItem(STORAGE_KEY);
      return stored ? (JSON.parse(stored) as BuildState) : {};
    } catch {
      return {};
    }
  });

  const initialPlatform =
    (searchParams.get("platform") as string) || "AR-15";
  const [platform, setPlatform] = useState<string>(initialPlatform);

  const category = useMemo(
    () => CATEGORIES.find((c) => c.id === categoryId),
    [categoryId],
  );

  useEffect(() => {
    if (!categoryId) return;

    const controller = new AbortController();

    async function fetchCategoryParts() {
      try {
        setLoading(true);
        setError(null);

        const search = new URLSearchParams();
        search.set("platform", platform);

        const url = `${API_BASE_URL}/api/products?${search.toString()}`;

        const res = await fetch(url, { signal: controller.signal });

        if (!res.ok) {
          throw new Error(`Failed to load products (${res.status})`);
        }

        const data: GunbuilderProductFromApi[] = await res.json();

        const normalized: UiPart[] = data.map((p) => ({
          id: String(p.id),                 // normalize to string for BuildState
          categoryId,
          name: p.name,
          brand: p.brand,
          price: p.price ?? 0,
          imageUrl: p.imageUrl ?? undefined, // match backend field name
          url: p.buyUrl ?? undefined,
          notes: undefined,
          inStock: p.inStock ?? true,
        }));

        setParts(normalized);
      } catch (err: any) {
        if (err.name === "AbortError") return;
        setError(err.message ?? "Failed to load products");
      } finally {
        setLoading(false);
      }
    }

    fetchCategoryParts();

    return () => controller.abort();
  }, [categoryId, platform]);

  //  persist build to localStorage whenever it changes
  useEffect(() => {
    if (typeof window === "undefined") return;
    try {
      window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));
    } catch {
      // ignore
    }
  }, [build]);

  //  handler to toggle Add / Remove for this category
  const handleTogglePart = (categoryId: CategoryId, partId: string) => {
    const isSelected = build[categoryId] === partId;

    if (isSelected) {
      // Remove from build
      setBuild((prev) => {
        const updated: BuildState = { ...prev };
        delete updated[categoryId];
        return updated;
      });
    } else {
      // Add to build and navigate back to main gunbuilder page
      setBuild((prev) => ({
        ...prev,
        [categoryId]: partId,
      }));
      router.push("/builder");
    }
  };

  // available brands for filter
  const availableBrands = useMemo(
    () =>
      Array.from(new Set(parts.map((p) => p.brand)))
        .filter(Boolean)
        .sort((a, b) => a.localeCompare(b)),
    [parts],
  );
  const priceBounds = useMemo(() => {
    if (parts.length === 0) {
      return { min: null as number | null, max: null as number | null };
    }

    let min = Number.POSITIVE_INFINITY;
    let max = Number.NEGATIVE_INFINITY;

    for (const p of parts) {
      const price = p.price ?? 0;
      if (price < min) min = price;
      if (price > max) max = price;
    }

    if (!Number.isFinite(min) || !Number.isFinite(max)) {
      return { min: null as number | null, max: null as number | null };
    }

    return { min, max };
  }, [parts]);

  // initialize / clamp priceRange whenever bounds change
  useEffect(() => {
    if (priceBounds.min == null || priceBounds.max == null) return;

    setPriceRange((prev) => {
      const min = prev.min ?? priceBounds.min!;
      const max = prev.max ?? priceBounds.max!;
      return {
        min: Math.max(priceBounds.min!, Math.min(min, priceBounds.max!)),
        max: Math.min(priceBounds.max!, Math.max(max, priceBounds.min!)),
      };
    });
  }, [priceBounds.min, priceBounds.max]);

  const filteredParts = useMemo(() => {
    let result = [...parts];

    // Price range filter
    const effectiveMin =
      priceRange.min ?? (priceBounds.min != null ? priceBounds.min : null);
    const effectiveMax =
      priceRange.max ?? (priceBounds.max != null ? priceBounds.max : null);

    if (effectiveMin != null && effectiveMax != null) {
      result = result.filter((p) => {
        const price = p.price ?? 0;
        return price >= effectiveMin && price <= effectiveMax;
      });
    }

    // Brand filter
    if (brandFilter.length > 0) {
      result = result.filter((p) => brandFilter.includes(p.brand));
    }

    // In-stock filter
    if (inStockOnly) {
      result = result.filter((p) => p.inStock ?? true);
    }

    const normalizedQuery = searchQuery.trim().toLowerCase();
    if (normalizedQuery) {
      result = result.filter((p) => {
        const name = p.name.toLowerCase();
        const brand = p.brand.toLowerCase();
        return (
          name.includes(normalizedQuery) ||
          brand.includes(normalizedQuery)
        );
      });
    }

    switch (sortBy) {
      case "price-asc":
        result.sort((a, b) => a.price - b.price);
        break;
      case "price-desc":
        result.sort((a, b) => b.price - a.price);
        break;
      case "brand-asc":
        result.sort((a, b) => a.brand.localeCompare(b.brand));
        break;
      case "relevance":
      default:
        // leave in backend order
        break;
    }

    // Pin the currently selected part (for this category) to the top, if any
    const selectedId = build[categoryId];
    if (selectedId) {
      const selected = result.filter((p) => p.id === selectedId);
      const others = result.filter((p) => p.id !== selectedId);
      result = [...selected, ...others];
    }

    return result;
  }, [parts, brandFilter, sortBy, build, categoryId, searchQuery]);

  const totalPages = useMemo(
    () => (filteredParts.length === 0 ? 1 : Math.ceil(filteredParts.length / PAGE_SIZE)),
    [filteredParts, PAGE_SIZE]
  );

  const paginatedParts = useMemo(() => {
    if (filteredParts.length === 0) return [];
    const startIndex = (currentPage - 1) * PAGE_SIZE;
    return filteredParts.slice(startIndex, startIndex + PAGE_SIZE);
  }, [filteredParts, currentPage, PAGE_SIZE]);

  useEffect(() => {
    // whenever the category or filters change, jump back to page 1
    setCurrentPage(1);
  }, [categoryId, brandFilter, sortBy, searchQuery, priceRange, inStockOnly, platform]);

  useEffect(() => {
    const nextPlatform =
      (searchParams.get("platform") as string) || "AR-15";
    setPlatform(nextPlatform);
  }, [searchParams]);

  const visibleRange = useMemo(() => {
    if (filteredParts.length === 0) {
      return { start: 0, end: 0 };
    }
    const start = (currentPage - 1) * PAGE_SIZE + 1;
    const end = Math.min(start + paginatedParts.length - 1, filteredParts.length);
    return { start, end };
  }, [filteredParts.length, currentPage, paginatedParts.length, PAGE_SIZE]);


  if (!category) {
    return (
      <main className="min-h-screen bg-black text-zinc-50">
        <div className="mx-auto max-w-6xl px-4 py-6 lg:py-10">
          <div className="text-center">
            <h1 className="text-2xl font-semibold text-zinc-50 mb-4">
              Category Not Found
            </h1>
            <Link
              href="/builder"
              className="text-amber-300 hover:text-amber-200 underline"
            >
              Return to Builder
            </Link>
          </div>
        </div>
      </main>
    );
  }

  return (
    <main className="min-h-screen bg-black text-zinc-50">
      <div className="mx-auto max-w-6xl px-4 py-6 lg:py-10">
        {/* Header */}
        <header className="mb-6">
          <Link
            href="/builder"
            className="text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block"
          >
            ← Back to The Armory
          </Link>
          <div className="flex items-start justify-between gap-4">
            <div>
              <p className="text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500">
                Shadow Standard
              </p>
              <h1 className="mt-1 text-2xl md:text-3xl font-semibold tracking-tight">
                {category.name} <span className="text-amber-300">Parts</span>
              </h1>
              <p className="mt-2 text-sm text-zinc-400 max-w-xl">
                Browse all available {category.name.toLowerCase()} options for
                your build, pulled live from your Ballistic backend.
              </p>
            </div>
            {!loading && !error && parts.length > 0 && (
              <div className="flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60">
                <button
                  type="button"
                  onClick={() => setViewMode("card")}
                  className={`px-3 py-1.5 text-xs font-medium rounded transition-colors ${
                    viewMode === "card"
                      ? "bg-zinc-800 text-zinc-50"
                      : "text-zinc-400 hover:text-zinc-300"
                  }`}
                  aria-label="Card view"
                >
                  Card
                </button>
                <button
                  type="button"
                  onClick={() => setViewMode("list")}
                  className={`px-3 py-1.5 text-xs font-medium rounded transition-colors ${
                    viewMode === "list"
                      ? "bg-zinc-800 text-zinc-50"
                      : "text-zinc-400 hover:text-zinc-300"
                  }`}
                  aria-label="List view"
                >
                  List
                </button>
              </div>
            )}
          </div>
        </header>

        {/* Parts Grid/List */}
        <section className="rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4">
        <div className="flex flex-col gap-4 md:flex-row">
          {/* Left sidebar: filters */}
          {!loading && !error && parts.length > 0 && (
            <aside className="w-full md:w-64 shrink-0 rounded-md border border-zinc-800 bg-zinc-950/80 p-3 space-y-4">
              <div>
                <h2 className="text-xs font-semibold uppercase tracking-[0.16em] text-zinc-500">
                  Filters
                </h2>
                <p className="mt-1 text-[11px] text-zinc-500">
                  Narrow down the {category.name.toLowerCase()} list.
                </p>
              </div>

                            {/* Price range */}
                            <div>
                <div className="mb-1.5 flex items-center justify-between">
                  <span className="text-[11px] font-medium uppercase tracking-[0.12em] text-zinc-500">
                    Price
                  </span>
                  {priceRange.min !== null || priceRange.max !== null ? (
                    <button
                      type="button"
                      onClick={() =>
                        setPriceRange({
                          min: priceBounds.min,
                          max: priceBounds.max,
                        })
                      }
                      className="text-[10px] text-zinc-400 hover:text-zinc-200"
                    >
                      Reset
                    </button>
                  ) : null}
                </div>
                {priceBounds.min == null || priceBounds.max == null ? (
                  <p className="text-[11px] text-zinc-500">
                    No price data available.
                  </p>
                ) : (
                  <div className="space-y-3">
                    <div className="flex items-center justify-between text-[10px] text-zinc-400">
                      <span>
                        Min:{" "}
                        <span className="font-semibold text-zinc-200">
                          $
                          {(priceRange.min ?? priceBounds.min).toFixed(0)}
                        </span>
                      </span>
                      <span>
                        Max:{" "}
                        <span className="font-semibold text-zinc-200">
                          $
                          {(priceRange.max ?? priceBounds.max).toFixed(0)}
                        </span>
                      </span>
                    </div>
                    <div className="space-y-2">
                      <input
                        type="range"
                        min={priceBounds.min ?? 0}
                        max={priceBounds.max ?? 0}
                        value={priceRange.min ?? priceBounds.min ?? 0}
                        onChange={(e) => {
                          const value = Number(e.target.value);
                          setPriceRange((prev) => ({
                            min: Math.min(
                              value,
                              prev.max ?? priceBounds.max ?? value
                            ),
                            max:
                              prev.max ??
                              priceBounds.max ??
                              value,
                          }));
                        }}
                        className="w-full"
                      />
                      <input
                        type="range"
                        min={priceBounds.min ?? 0}
                        max={priceBounds.max ?? 0}
                        value={priceRange.max ?? priceBounds.max ?? 0}
                        onChange={(e) => {
                          const value = Number(e.target.value);
                          setPriceRange((prev) => ({
                            min:
                              prev.min ??
                              priceBounds.min ??
                              value,
                            max: Math.max(
                              value,
                              prev.min ?? priceBounds.min ?? value
                            ),
                          }));
                        }}
                        className="w-full"
                      />
                    </div>
                  </div>
                )}
              </div>

              {/* Brand multi-select */}
              <div>
                <div className="mb-1.5 flex items-center justify-between">
                  <span className="text-[11px] font-medium uppercase tracking-[0.12em] text-zinc-500">
                    Brand
                  </span>
                  {brandFilter.length > 0 && (
                    <button
                      type="button"
                      onClick={() => setBrandFilter([])}
                      className="text-[10px] text-zinc-400 hover:text-zinc-200"
                    >
                      Clear
                    </button>
                  )}
                </div>
                {availableBrands.length === 0 ? (
                  <p className="text-[11px] text-zinc-500">
                    No brands available yet.
                  </p>
                ) : (
                  <div className="max-h-56 space-y-1 overflow-y-auto pr-1">
                    {availableBrands.map((b) => {
                      const checked = brandFilter.includes(b);
                      return (
                        <label
                          key={b}
                          className="flex cursor-pointer items-center gap-2 rounded px-1 py-0.5 text-[11px] text-zinc-200 hover:bg-zinc-900/80"
                        >
                          <input
                            type="checkbox"
                            className="h-3 w-3 rounded border-zinc-600 bg-zinc-900 text-amber-400 focus:ring-amber-400"
                            checked={checked}
                            onChange={(e) => {
                              setBrandFilter((prev) =>
                                e.target.checked
                                  ? [...prev, b]
                                  : prev.filter((brand) => brand !== b)
                              );
                            }}
                          />
                          <span className="truncate">{b}</span>
                        </label>
                      );
                    })}
                  </div>
                )}
                {brandFilter.length === 0 && availableBrands.length > 0 && (
                  <p className="mt-1 text-[10px] text-zinc-500">
                    No brands selected — showing all.
                  </p>
                )}
              </div>

              {/* In-stock toggle */}
              <div className="border-t border-zinc-800 pt-3">
                <label className="flex cursor-pointer items-center justify-between text-[11px] text-zinc-200">
                  <span className="font-medium uppercase tracking-[0.12em] text-zinc-500">
                    In stock only
                  </span>
                  <input
                    type="checkbox"
                    className="h-3 w-3 rounded border-zinc-600 bg-zinc-900 text-amber-400 focus:ring-amber-400"
                    checked={inStockOnly}
                    onChange={(e) => setInStockOnly(e.target.checked)}
                  />
                </label>
                <p className="mt-1 text-[10px] text-zinc-500">
                  Hides items marked out of stock by the backend.
                </p>
              </div>
            </aside>
          )}

          {/* Right side: toolbar + results */}
          <div className="flex-1">
            {/* Top toolbar: count + search + sort */}
            {!loading && !error && parts.length > 0 && (
              <div className="mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between">
                <div className="text-xs text-zinc-500">
                  Showing{" "}
                  <span className="font-medium text-zinc-200">
                    {visibleRange.start}-{visibleRange.end}
                  </span>{" "}
                  of{" "}
                  <span className="font-medium text-zinc-200">
                    {filteredParts.length}
                  </span>{" "}
                  matching parts
                </div>
                <div className="flex flex-wrap gap-3">
                  <div className="flex items-center gap-2">
                    <label
                      htmlFor="part-search"
                      className="text-xs text-zinc-500"
                    >
                      Search
                    </label>
                    <div className="relative">
                      <input
                        id="part-search"
                        type="text"
                        value={searchQuery}
                        onChange={(e) => setSearchQuery(e.target.value)}
                        placeholder={`Search ${category.name.toLowerCase()}...`}
                        className="rounded-md border border-zinc-700 bg-zinc-900/70 px-2 py-1 pr-6 text-xs text-zinc-200 focus:outline-none focus:ring-1 focus:ring-amber-400"
                      />
                      {searchQuery && (
                        <button
                          type="button"
                          onClick={() => setSearchQuery("")}
                          className="absolute right-1 top-1/2 -translate-y-1/2 text-xs leading-none text-zinc-500 hover:text-zinc-300"
                          aria-label="Clear search"
                        >
                          ×
                        </button>
                      )}
                    </div>
                  </div>
                  <div className="flex items-center gap-2">
                    <label
                      htmlFor="platform-select"
                      className="text-xs text-zinc-500"
                    >
                      Platform
                    </label>
                    <select
                      id="platform-select"
                      value={platform}
                      onChange={(e) => setPlatform(e.target.value)}
                      className="rounded-md border border-zinc-700 bg-zinc-900/70 px-2 py-1 text-xs text-zinc-200 focus:outline-none focus:ring-1 focus:ring-amber-400"
                    >
                      {PLATFORMS.map((p) => (
                        <option key={p} value={p}>
                          {p}
                        </option>
                      ))}
                    </select>
                  </div>
                  <div className="flex items-center gap-2">
                    <label
                      htmlFor="sort-by"
                      className="text-xs text-zinc-500"
                    >
                      Sort
                    </label>
                    <select
                      id="sort-by"
                      value={sortBy}
                      onChange={(e) =>
                        setSortBy(e.target.value as SortOption)
                      }
                      className="rounded-md border border-zinc-700 bg-zinc-900/70 px-2 py-1 text-xs text-zinc-200 focus:outline-none focus:ring-1 focus:ring-amber-400"
                    >
                      <option value="relevance">Relevance</option>
                      <option value="price-asc">Price: Low → High</option>
                      <option value="price-desc">Price: High → Low</option>
                      <option value="brand-asc">Brand: A → Z</option>
                    </select>
                  </div>
                </div>
              </div>
            )}

            {/* Results / states */}
            {loading ? (
              <p className="py-8 text-center text-sm text-zinc-500">
                Loading {category.name.toLowerCase()}…
              </p>
            ) : error ? (
              <p className="py-8 text-center text-sm text-red-400">
                {error} — check that the Ballistic API is running.
              </p>
            ) : filteredParts.length === 0 ? (
              <p className="py-8 text-center text-sm text-zinc-500">
                No parts available for this category yet.
              </p>
            ) : viewMode === "card" ? (
              <div className="grid gap-3 md:grid-cols-2 lg:grid-cols-3">
                {paginatedParts.map((part) => {
                  const isSelected = build[categoryId] === part.id;

                  return (
                    <div
                      key={part.id}
                      className={`group relative flex flex-col rounded-md border p-3 transition-all duration-200 ${
                        isSelected
                          ? "border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]"
                          : "border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10"
                      }`}
                    >
                      <div className="mb-3 flex items-center gap-2 justify-between">
                        <div className="flex-1">
                          <div className="text-sm font-semibold text-zinc-50">
                            {part.brand}{" "}
                            <span className="font-normal">
                              — {part.name}
                            </span>
                          </div>
                          {part.notes && (
                            <p className="mt-1 line-clamp-2 text-xs text-zinc-400">
                              {part.notes}
                            </p>
                          )}
                        </div>
                        <div className="whitespace-nowrap text-sm font-semibold text-amber-300">
                          ${part.price.toFixed(2)}
                        </div>
                      </div>
                      <div className="mt-2 flex gap-2">
                        <Link
                          href={{
                            pathname: `/builder/${categoryId}/${part.id}-${slugify(part.name)}`,
                            query: { platform },
                          }}
                          className="flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-center text-xs font-medium text-zinc-300 transition-colors hover:border-zinc-600 hover:bg-zinc-700"
                        >
                          View Details
                        </Link>
                        <button
                          type="button"
                          onClick={() => handleTogglePart(categoryId, part.id)}
                          className={`flex-1 rounded-md px-3 py-2 text-center text-xs font-semibold transition-colors ${
                            isSelected
                              ? "border border-zinc-600 bg-zinc-800 text-zinc-100 hover:bg-zinc-700"
                              : "bg-amber-400 text-black hover:bg-amber-300"
                          }`}
                        >
                          {isSelected ? "Remove from Build" : "Add to Build"}
                        </button>
                      </div>
                    </div>
                  );
                })}
              </div>
            ) : (
              <>
                {/* Header row for list view */}
                <div className="hidden grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500 md:grid">
                  <span>Part</span>
                  <span>Brand</span>
                  <span className="text-right">Price</span>
                  <span className="pr-2 text-right">Actions</span>
                </div>

                <div className="space-y-2">
                  {paginatedParts.map((part) => {
                    const isSelected = build[categoryId] === part.id;

                    return (
                      <div
                        key={part.id}
                        className={`group relative rounded-md border p-3 transition-all duration-200 ${
                          isSelected
                            ? "border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]"
                            : "border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10"
                        }`}
                      >
                        <div className="flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4">
                          <div className="min-w-0 flex-1">
                            <div className="text-sm font-semibold text-zinc-50">
                              {part.name}
                            </div>
                            {part.notes && (
                              <p className="mt-1 line-clamp-1 text-xs text-zinc-400">
                                {part.notes}
                              </p>
                            )}
                          </div>
                          <div className="text-xs text-zinc-400 md:text-left md:text-sm">
                            {part.brand}
                          </div>
                          <div className="text-sm font-semibold text-amber-300 md:text-right">
                            ${part.price.toFixed(2)}
                          </div>
                          <div className="flex justify-end gap-2">
                            <Link
                              href={{
                                pathname: `/builder/${categoryId}/${part.id}-${slugify(part.name)}`,
                                query: { platform },
                              }}
                              className="whitespace-nowrap rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 transition-colors hover:border-zinc-600 hover:bg-zinc-700"
                            >
                              View Details
                            </Link>
                            <button
                              type="button"
                              onClick={() =>
                                handleTogglePart(categoryId, part.id)
                              }
                              className={`whitespace-nowrap rounded-md px-3 py-1.5 text-xs font-semibold transition-colors ${
                                isSelected
                                  ? "border border-zinc-600 bg-zinc-800 text-zinc-100 hover:bg-zinc-700"
                                  : "bg-amber-400 text-black hover:bg-amber-300"
                              }`}
                            >
                              {isSelected ? "Remove from Build" : "Add to Build"}
                            </button>
                          </div>
                        </div>
                      </div>
                    );
                  })}
                </div>
              </>
            )}

            {/* Pagination controls */}
            {filteredParts.length > 0 && totalPages > 1 && (
              <div className="mt-4 flex items-center justify-between text-xs text-zinc-400">
                <div>
                  Page{" "}
                  <span className="font-semibold text-zinc-200">
                    {currentPage}
                  </span>{" "}
                  of{" "}
                  <span className="font-semibold text-zinc-200">
                    {totalPages}
                  </span>
                </div>
                <div className="flex gap-2">
                  <button
                    type="button"
                    onClick={() =>
                      setCurrentPage((p) => Math.max(1, p - 1))
                    }
                    disabled={currentPage === 1}
                    className="rounded border border-zinc-700 bg-zinc-900/70 px-3 py-1 hover:bg-zinc-800 disabled:opacity-40"
                  >
                    Previous
                  </button>
                  <button
                    type="button"
                    onClick={() =>
                      setCurrentPage((p) => Math.min(totalPages, p + 1))
                    }
                    disabled={currentPage === totalPages}
                    className="rounded border border-zinc-700 bg-zinc-900/70 px-3 py-1 hover:bg-zinc-800 disabled:opacity-40"
                  >
                    Next
                  </button>
                </div>
              </div>
            )}
          </div>
        </div>
        </section>
      </div>
    </main>
  );
}