'use client'; import { useState } from 'react'; import Image from 'next/image'; import Link from 'next/link'; import { Phone, ShoppingCart, GitCompare, Check, Thermometer, Volume2, Zap, Wind, Star, Info, Eye, X, type LucideIcon } from 'lucide-react'; import { Product } from '@/content/products'; import { useCartStore } from '@/lib/cart-store'; import { useCompareStore } from '@/lib/compare-store'; import { getProductVariants } from '@/content/product-variants'; import { useRecentlyViewedStore } from '@/lib/recently-viewed-store'; import { RecentlyViewedProducts } from './RecentlyViewedProducts'; import { useEffect } from 'react'; const brandLogos: Record = { 'Gree': '/brands/gree.webp', 'Rotenso': '/brands/rotenso.webp', 'Toshiba': '/brands/toshiba.webp', 'Daikin': '/brands/daikin.webp', 'CHV': '/brands/chv.webp', 'Haier': '/brands/haier.webp', 'LG': '/brands/lg.webp', 'Samsung': '/brands/samsung.webp', 'Mitsubishi Electric': '/brands/mitsubishi.webp', 'Fuji Electric': '/brands/fuji.webp', 'Aux': '/brands/aux-brand.webp', 'AUX': '/brands/aux-brand.webp', }; interface Props { product: Product; seriesProducts: Product[]; companyPhone: string; companyPhoneRaw: string; } function estimateSEER(klasa: string): number { if (!klasa) return 5.0; const k = klasa.toUpperCase(); if (k.includes('A+++')) return 8.5; if (k.includes('A++')) return 6.1; if (k.includes('A+')) return 4.6; if (k.includes('A')) return 3.6; return 5.0; } function parseMoc(val: string): number { if (!val) return 0; const nums = val.replace(',', '.').match(/[\d.]+/g); if (!nums) return 0; if (nums.length === 1) return parseFloat(nums[0]); // zakres: bierz środkową const floats = nums.map(parseFloat); return floats[Math.floor(floats.length / 2)]; } const TABS = ['Opis', 'Specyfikacja', 'Montaż', 'Opinie'] as const; type Tab = typeof TABS[number]; function seededViews(slug: string): number { let hash = 0; for (let i = 0; i < slug.length; i++) { hash = (hash * 31 + slug.charCodeAt(i)) >>> 0; } return 18 + (hash % 50); } export function ProductPageClient({ product, seriesProducts, companyPhone, companyPhoneRaw }: Props) { const [currentProduct, setCurrentProduct] = useState(product); const [activeTab, setActiveTab] = useState('Opis'); const [godziny, setGodziny] = useState(8); const [cartState, setCartState] = useState<'idle' | 'added' | 'cart'>('idle'); const [showViewsBanner, setShowViewsBanner] = useState(true); const viewsCount = seededViews(currentProduct.slug); const variants = getProductVariants(currentProduct.slug); const addToCart = useCartStore(s => s.addItem); const { addItem: addCompare, removeItem: removeCompare, isAdded } = useCompareStore(); const inCompare = isAdded(currentProduct.slug); const addRecentlyViewed = useRecentlyViewedStore((s) => s.addItem); useEffect(() => { addRecentlyViewed(currentProduct); }, [currentProduct, addRecentlyViewed]); const handleAddToCart = () => { if (!currentProduct.price) return; addToCart({ slug: currentProduct.slug, name: currentProduct.name, brand: currentProduct.brand, image: currentProduct.image, price: currentProduct.price, }); setCartState('added'); setTimeout(() => setCartState('cart'), 1500); }; const handleCompare = () => { if (inCompare) removeCompare(currentProduct.slug); else addCompare({ slug: currentProduct.slug, name: currentProduct.name, brand: currentProduct.brand, price: currentProduct.price, image: currentProduct.image, specs: currentProduct.specs }); }; const mocChlodnicza = parseMoc(currentProduct.specs['Moc chłodnicza'] || ''); const pobórMocy = parseMoc(currentProduct.specs['Pobór mocy chłodzenie (kW)'] || '') || (mocChlodnicza / estimateSEER(currentProduct.specs['Klasa energetyczna'] || '')); const cenaKwh = 0.75; const kosztGodzina = pobórMocy * cenaKwh; const kosztMiesiac = kosztGodzina * godziny * 30; const params = [ currentProduct.specs['Klasa energetyczna'] && { icon: Star, label: 'Klasa energetyczna', value: currentProduct.specs['Klasa energetyczna'], color: 'text-green-600 bg-green-50' }, currentProduct.specs['Moc chłodnicza'] && { icon: Thermometer, label: 'Moc chłodnicza', value: `${currentProduct.specs['Moc chłodnicza']} kW`, color: 'text-blue-600 bg-blue-50' }, currentProduct.specs['Moc grzewcza (kW)'] && { icon: Thermometer, label: 'Moc grzewcza', value: `${currentProduct.specs['Moc grzewcza (kW)']} kW`, color: 'text-orange-600 bg-orange-50' }, currentProduct.specs['Hałas wewnątrz (dB)'] && { icon: Volume2, label: 'Hałas wewnątrz', value: `${currentProduct.specs['Hałas wewnątrz (dB)']} dB`, color: 'text-purple-600 bg-purple-50' }, currentProduct.specs['Czynnik chłodniczy'] && { icon: Wind, label: 'Czynnik', value: currentProduct.specs['Czynnik chłodniczy'], color: 'text-teal-600 bg-teal-50' }, currentProduct.specs['Grzanie do'] && { icon: Zap, label: 'Grzanie do', value: `-${currentProduct.specs['Grzanie do']}°C`, color: 'text-accent bg-accent-light' }, ].filter(Boolean) as { icon: LucideIcon; label: string; value: string; color: string }[]; return (
{currentProduct.name} {currentProduct.specs['Klasa energetyczna'] && (
{currentProduct.specs['Klasa energetyczna'].split('/')[0]}
)} {currentProduct.category === 'multisplit' && (
MULTISPLIT
)}
{brandLogos[currentProduct.brand] ? (
{currentProduct.brand}
) : ( {currentProduct.brand} )} {currentProduct.brand === 'LG' && (
Serwisujemy urządzenia LG ✓
)}

{currentProduct.name}

SKU: {currentProduct.sku}

{variants && variants.moce.length > 0 && (

Dostępne moce (kW):

{variants.moce.map((v) => ( ))}
)} {variants && variants.wykończenia.length > 0 && (

Wykończenie:

{variants.wykończenia.map((v) => ( ))}
)} {params.length > 0 && (
{params.map((p, i) => { const Icon = p.icon; return (

{p.label}

{p.value}

); })}
)}
{currentProduct.price !== null ? ( <>
{currentProduct.price.toLocaleString('pl-PL')} zł

cena urządzenia brutto (23% VAT)

Montaż wyceniamy indywidualnie — zadzwoń lub napisz

{cartState === 'idle' && ( )} {cartState === 'added' && ( )} {cartState === 'cart' && ( Zobacz koszyk )} Zapytaj o montaż
) : ( <>

Cena na zapytanie

Multisplit — cena zależy od konfiguracji jednostek wewnętrznych.

Zadzwoń: {companyPhone} )}
Profesjonalna porada {companyPhone} {mocChlodnicza > 0 && (

Kalkulator kosztów energii

Szacunek przy cenie prądu {cenaKwh} zł/kWh. Rzeczywiste koszty mogą się różnić.
setGodziny(Number(e.target.value))} className="range range-xs range-accent flex-1" /> {godziny}h

Koszt / godzinę

{kosztGodzina.toFixed(2)} zł

Koszt miesięczny

{kosztMiesiac.toFixed(2)} zł

Szacunek przy {cenaKwh} zł/kWh · {godziny}h/dzień · 30 dni {!currentProduct.specs['Pobór mocy chłodzenie (kW)'] && ' · pobór szacowany z klasy energetycznej'}

)}
{TABS.map(tab => ( ))}
{activeTab === 'Opis' && (
{currentProduct.shortDescription ? (

{currentProduct.shortDescription}

) : (

Brak opisu produktu.

)}
)} {activeTab === 'Specyfikacja' && (
{Object.keys(currentProduct.specs).length > 0 ? (
{Object.entries(currentProduct.specs).map(([key, val], idx) => ( ))}
{key} {val}
) : (

Brak specyfikacji.

)}
)} {activeTab === 'Montaż' && (

Montaż klimatyzacji

Oferujemy profesjonalny montaż wszystkich klimatyzatorów z naszego sklepu na terenie Dolnego Śląska. Montaż wykonujemy z uprawnieniami F-Gaz, estetycznie i terminowo.

    {['Bezpłatna wycena montażu przed realizacją', 'Uprawnienia F-Gaz — wymóg prawny', 'Próba szczelności i próżnia po montażu', 'Szkolenie z obsługi urządzenia', 'Gwarancja na wykonaną instalację'].map(item => (
  • {item}
  • ))}
Zapytaj o montaż
)} {activeTab === 'Opinie' && (

Dodaj opinię

{ e.preventDefault(); alert('Opinia została wysłana i oczekuje na moderację.'); e.currentTarget.reset(); }}>
{[1,2,3,4,5].map(star => ( ))}

Opinie klientów (0)

Bądź pierwszą osobą, która oceni ten produkt!

)}
{showViewsBanner && (

W ostatnich 30 dniach interesuje się tym produktem {viewsCount} osób.

)}
); }