<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vehicle Inventory — Che Wang Hui Fei | 车王认证二手车超市</title>
<meta name="description" content="Browse real vehicles from our Suzhou inventory. Haval, BYD, Chery, VW, Audi, and more. Domestic prices in RMB. Contact us for FOB export pricing.">
<meta property="og:title" content="Vehicle Inventory — Che Wang Hui Fei | 车王认证二手车超市">
<meta property="og:description" content="Browse real vehicles from our Suzhou inventory. Domestic prices in RMB. Contact us for FOB export pricing.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://cnusedcar.shop/inventory.html">
<meta property="og:image" content="https://images.unsplash.com/photo-1552519507-da3b142c6e3d?w=1200&q=80">
<link rel="canonical" href="https://cnusedcar.shop/inventory.html">
<link rel="alternate" hreflang="en" href="https://cnusedcar.shop/inventory.html">
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='%231a3a5c' rx='4'/%3E%3Ctext x='16' y='22' font-size='18' text-anchor='middle' fill='%23d4a017' font-family='sans-serif' font-weight='bold'%3EC%3C/text%3E%3C/svg%3E">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/style.css">
</head>
<body>

<!-- ===== FLOATING CONTACT ===== -->
<div class="float-contact">
  <a href="tel:+8615601936680" class="phone" title="Call Us">📞</a>
  <a href="https://wa.me/8615601936680" target="_blank" class="whatsapp" title="WhatsApp">💬</a>
  <a href="mailto:shenqidaxia2023@gmail.com" class="email" title="Email">✉️</a>
</div>

<!-- ===== HEADER ===== -->
<header class="header">
  <div class="container">
    <a href="index.html" class="logo">
      Che Wang Hui Fei
      <span>车王认证二手车超市 · SINCE 2020</span>
    </a>
    <button class="nav-toggle" id="navToggle" aria-label="Menu">
      <span></span><span></span><span></span>
    </button>
    <nav class="nav" id="navMenu">
      <a href="index.html">Home</a>
      <a href="inventory.html" class="active">Inventory</a>
      <a href="about.html">About</a>
      <a href="services.html">Services</a>
      <a href="contact.html">Contact</a>
    </nav>
    <div class="header-right">
      <a href="tel:+8615601936680" class="header-phone">📞 +86-15601936680</a>
    </div>
  </div>
</header>

<!-- ===== PAGE HERO ===== -->
<section class="page-hero">
  <div class="container">
    <h1>Vehicle Inventory</h1>
    <p>Real vehicles from our Suzhou inventory. Prices shown in RMB. Contact us for FOB export pricing.</p>
  </div>
</section>

<!-- ===== FILTERS ===== -->
<section class="filters">
  <div class="container">
    <select class="filter-select" id="filter-type">
      <option value="all">All Types</option>
    </select>
    <select class="filter-select" id="filter-brand">
      <option value="all">All Brands</option>
    </select>
    <select class="filter-select" id="filter-fuel">
      <option value="all">All Fuel</option>
    </select>
    <select class="filter-select" id="filter-sort">
      <option value="">Sort: Default</option>
      <option value="price-asc">Price: Low → High</option>
      <option value="price-desc">Price: High → Low</option>
      <option value="name">Name: A-Z</option>
    </select>
    <input type="text" class="filter-search" id="filter-search" placeholder="Search vehicles...">
    <span class="filter-count" id="filter-count">Loading...</span>
  </div>
</section>

<!-- ===== INVENTORY ===== -->
<section class="inventory-section">
  <div class="container">
    <div id="inventoryGrid"><!-- populated by JS --></div>
    <div id="noResults" class="no-results" style="display:none;">
      <p>No vehicles match your filters. Try adjusting your search criteria.</p>
    </div>
  </div>
</section>

<!-- ===== BOTTOM CTA ===== -->
<section class="cta-banner">
  <div class="container">
    <h2>Don't See What You're Looking For?</h2>
    <p>We can source specific models on request. Contact us with your requirements.</p>
    <a href="contact.html" class="btn btn-accent btn-lg">Request Custom Sourcing →</a>
  </div>
</section>

<!-- ===== FOOTER ===== -->
<footer class="footer">
  <div class="container">
    <div class="footer-grid">
      <div class="footer-brand">
        <a href="index.html" class="logo">Che Wang Hui Fei <span>车王认证二手车超市</span></a>
        <p>Che Wang Hui Fei (Suzhou) Used Car Trading Co., Ltd. — licensed Chinese auto exporter serving global buyers since 2020.</p>
        <p style="font-size:0.78rem;color:rgba(255,255,255,0.3);">Also on: <a href="https://chewanghf.en.alibaba.com" target="_blank" style="color:var(--accent);">Alibaba International Station</a></p>
      </div>
      <div>
        <h4>Quick Links</h4>
        <ul class="footer-links">
          <li><a href="inventory.html">Inventory</a></li>
          <li><a href="about.html">About</a></li>
          <li><a href="services.html">Services</a></li>
          <li><a href="contact.html">Contact</a></li>
        </ul>
      </div>
      <div>
        <h4>Brands</h4>
        <ul class="footer-links">
          <li><a href="inventory.html?brand=Haval">Haval</a></li>
          <li><a href="inventory.html?brand=BYD">BYD</a></li>
          <li><a href="inventory.html?brand=Chery">Chery</a></li>
          <li><a href="inventory.html?brand=BAIC">BAIC</a></li>
        </ul>
      </div>
      <div>
        <h4>Contact</h4>
        <ul class="footer-contact">
          <li>📞 <a href="tel:+8615601936680">+86-15601936680</a></li>
          <li>✉️ <a href="mailto:shenqidaxia2023@gmail.com">shenqidaxia2023@gmail.com</a></li>
          <li>📍 Suzhou, China</li>
        </ul>
      </div>
    </div>
    <div class="footer-bottom">
      <p>© 2026 Che Wang Hui Fei (Suzhou) Used Car Trading Co., Ltd.</p>
    </div>
  </div>
</footer>

<script src="js/inventory.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
  // Get URL params
  var params = new URLSearchParams(window.location.search);
  var urlBrand = params.get('brand');
  var urlSearch = params.get('search');

  // Populate brand filter
  var brandSelect = document.getElementById('filter-brand');
  if (brandSelect && window.getUniqueBrands) {
    var brands = getUniqueBrands();
    brands.forEach(function(b) {
      var opt = document.createElement('option');
      opt.value = b;
      opt.textContent = b;
      brandSelect.appendChild(opt);
    });
  }

  // Populate type filter
  var typeSelect = document.getElementById('filter-type');
  if (typeSelect && window.getUniqueTypes) {
    var types = getUniqueTypes();
    types.forEach(function(t) {
      var opt = document.createElement('option');
      opt.value = t;
      opt.textContent = t;
      typeSelect.appendChild(opt);
    });
  }

  // Populate fuel filter
  var fuelSelect = document.getElementById('filter-fuel');
  if (fuelSelect && window.getUniqueFuels) {
    var fuels = getUniqueFuels();
    fuels.forEach(function(f) {
      var opt = document.createElement('option');
      opt.value = f;
      opt.textContent = f;
      fuelSelect.appendChild(opt);
    });
  }

  function renderInventory() {
    var type = document.getElementById('filter-type').value;
    var brand = document.getElementById('filter-brand').value;
    var fuel = document.getElementById('filter-fuel').value;
    var sort = document.getElementById('filter-sort').value;
    var search = document.getElementById('filter-search').value;

    var filtered = getFilteredCars({ type: type, brand: brand, fuel: fuel, search: search });
    var grid = document.getElementById('inventoryGrid');
    var count = document.getElementById('filter-count');
    var noResults = document.getElementById('noResults');

    // Apply sorting
    if (sort === 'price-asc') {
      filtered.sort(function(a,b) { return (a.priceMin||0) - (b.priceMin||0); });
    } else if (sort === 'price-desc') {
      filtered.sort(function(a,b) { return (b.priceMin||0) - (a.priceMin||0); });
    } else if (sort === 'name') {
      filtered.sort(function(a,b) { return a.name.localeCompare(b.name); });
    }

    if (filtered.length === 0) {
      grid.innerHTML = '';
      noResults.style.display = 'block';
      count.textContent = '0 vehicles found';
      return;
    }

    noResults.style.display = 'none';
    count.textContent = filtered.length + ' vehicles found';

    var html = '<div class="car-grid">';
    filtered.forEach(function(car) {
      var img = car.image || 'https://images.unsplash.com/photo-1552519507-da3b142c6e3d?w=600&q=80';
      var priceDisplay = car.priceMin ? '¥' + Number(car.priceMin).toLocaleString() + ' - ¥' + Number(car.priceMax).toLocaleString() : 'Price on Request';
      html += '<div class="car-card" onclick="window.location=\'car-detail.html?id=' + car.id + '\'">' +
        '<div class="car-card-img"><img src="' + img + '" alt="' + car.name + '" loading="lazy">' +
        '<span class="car-card-badge">' + car.type + '</span></div>' +
        '<div class="car-card-body"><h3>' + car.name + '</h3>' +
        '<div class="car-card-specs"><span>' + car.year + '</span><span>' + car.mileage + '</span><span>' + car.fuel + '</span><span>' + car.engine + '</span></div>' +
        '<div class="car-card-price">' + priceDisplay + '</div>' +
        '<div class="car-card-meta">' + car.origin + '</div>' +
        '<a href="car-detail.html?id=' + car.id + '" class="btn btn-primary btn-sm btn-block">View Details →</a></div></div>';
    });
    html += '</div>';
    grid.innerHTML = html;
  }

  // Attach filter events
  ['filter-type','filter-brand','filter-fuel','filter-sort'].forEach(function(id) {
    document.getElementById(id).addEventListener('change', renderInventory);
  });
  document.getElementById('filter-search').addEventListener('input', renderInventory);

  // Initial render
  renderInventory();

  // Apply URL params if present
  if (urlBrand) {
    for (var i = 0; i < brandSelect.options.length; i++) {
      if (brandSelect.options[i].value.toLowerCase() === urlBrand.toLowerCase()) {
        brandSelect.value = brandSelect.options[i].value;
        break;
      }
    }
    renderInventory();
  }
  if (urlSearch) {
    document.getElementById('filter-search').value = urlSearch;
    renderInventory();
  }
});
</script>
</body>
</html>
