'use client'; import { useState, useMemo } from 'react'; import Link from 'next/link'; import Image from 'next/image'; import { ArrowRight, ArrowLeft, Check, Thermometer, Home, Zap, ShoppingCart, Phone, RotateCcw } from 'lucide-react'; import { Product } from '@/content/products'; import { companyDetails } from '@/content/company'; interface Props { products: Product[]; } // Oblicz wymaganą moc chłodniczą w kW function calculatePower(m2: number, floor: string, sun: string, building: string): number { let power = m2 * 0.1; // baza: 1 kW na 10 m² // Korekta typu budynku i piętra if (building === 'apartment') { if (floor === 'top') power *= 1.2; // ostatnie piętro - więcej ciepła z dachu if (floor === 'ground') power *= 0.95; } else if (building === 'house') { if (floor === 'top') power *= 1.1; // poddasze - dodatkowe nagrzewanie } // Korekta nasłonecznienia if (sun === 'south') power *= 1.15; // południe - duże nasłonecznienie if (sun === 'west') power *= 1.1; if (sun === 'north') power *= 0.9; return Math.round(power * 10) / 10; } // Szacunkowy koszt montażu function estimateInstall(pipes: string, rooms: number): { min: number; max: number } { const base = rooms === 1 ? 1400 : rooms === 2 ? 2400 : rooms === 3 ? 3200 : 3800; const pipeExtra = pipes === 'short' ? 0 : pipes === 'medium' ? 300 : pipes === 'long' ? 700 : 1200; return { min: base + pipeExtra, max: base + pipeExtra + 600 }; } const STEPS = ['Typ', 'Pomieszczenie', 'Instalacja', 'Budżet'] as const; export function KalkulatorClient({ products }: Props) { const [deviceType, setDeviceType] = useState<'klimatyzacja' | 'pompa'>('klimatyzacja'); const [pumpFormSent, setPumpFormSent] = useState(false); const [pumpForm, setPumpForm] = useState({ name: '', phone: '', city: '', message: '' }); const [step, setStep] = useState(0); const [building, setBuilding] = useState('apartment'); const [pomieszczenia, setPomieszczenia] = useState<{ nazwa: string; m2: number }[]>([ { nazwa: 'Pokój 1', m2: 20 } ]); const [floor, setFloor] = useState('middle'); // ground | middle | top const [sun, setSun] = useState('south'); // north | east | south | west const addRoom = () => { if (pomieszczenia.length < 5) { setPomieszczenia(prev => [...prev, { nazwa: `Pokój ${prev.length + 1}`, m2: 15 }]); } }; const removeRoom = (i: number) => { if (pomieszczenia.length > 1) { setPomieszczenia(prev => prev.filter((_, idx) => idx !== i)); } }; const updateRoom = (i: number, m2: number) => { setPomieszczenia(prev => prev.map((r, idx) => idx === i ? { ...r, m2 } : r)); }; const [pipes, setPipes] = useState('medium'); // short(<3m) | medium(3-6m) | long(6-10m) | verylong(>10m) const [budget, setBudget] = useState(8000); const [showResults, setShowResults] = useState(false); const [preferredBrand, setPreferredBrand] = useState(''); const totalM2 = pomieszczenia.reduce((sum, p) => sum + p.m2, 0); const rooms = pomieszczenia.length; const requiredPower = useMemo(() => pomieszczenia.reduce((sum, p) => sum + calculatePower(p.m2, floor, sun, building), 0), [pomieszczenia, floor, sun, building] ); const requiredPowerRounded = Math.round(requiredPower * 10) / 10; const installCost = useMemo(() => estimateInstall(pipes, rooms), [pipes, rooms]); const category = rooms === 1 ? 'scienne' : 'multisplit'; const results = useMemo(() => { if (!showResults || deviceType === 'pompa') return []; const maxPrice = budget * 0.75; const powerMin = requiredPower * 0.6; const powerMax = requiredPower * 1.8; const filtered = products .filter(p => { if (p.category !== category) return false; if (preferredBrand && p.brand !== preferredBrand) return false; if (category === 'multisplit') { if (p.price !== null && p.price > maxPrice) return false; } else { if (p.price === null || p.price > maxPrice) return false; } const moc = parseFloat(String(p.specs?.['Moc chłodnicza'] || '0').replace(',', '.').split('–')[0]); return moc >= powerMin && moc <= powerMax; }) .sort((a, b) => { // Sortuj po tym jak blisko jest moc do wymaganej const mocA = parseFloat(String(a.specs?.['Moc chłodnicza'] || '0').replace(',', '.').split('–')[0]); const mocB = parseFloat(String(b.specs?.['Moc chłodnicza'] || '0').replace(',', '.').split('–')[0]); return Math.abs(mocA - requiredPower) - Math.abs(mocB - requiredPower); }); return filtered.length > 0 ? filtered.slice(0, 6) : products .filter(p => p.category === category && p.price !== null) .sort((a, b) => (a.price || 0) - (b.price || 0)) .slice(0, 6); }, [showResults, deviceType, products, requiredPower, category, budget, preferredBrand]); const handleFinish = () => setShowResults(true); const handleReset = () => { setShowResults(false); setStep(0); }; const handleNext = () => { setStep(s => s + 1); }; const handlePumpSubmit = async () => { if (!pumpForm.name || !pumpForm.phone || !pumpForm.city) return; // Na razie pokazujemy success — podepniemy Resend później setPumpFormSent(true); }; if (showResults) { if (deviceType === 'pompa') { return (

Wycena pompy ciepła

Każda instalacja pompy ciepła wymaga indywidualnego doboru urządzenia do specyfiki budynku (izolacja, instalacja grzewcza). Skontaktuj się z nami, a przygotujemy dla Ciebie bezpłatną, spersonalizowaną ofertę.

); } return (
{/* Podsumowanie */}

Dopasowane klimatyzatory

{[ { label: 'Wymagana moc', value: `${requiredPowerRounded} kW` }, { label: 'Powierzchnia', value: `${totalM2} m²` }, { label: 'Typ instalacji', value: category === 'scienne' ? 'Split (1 pokój)' : `Multisplit (${rooms} pokoje)` }, { label: 'Szac. montaż', value: `${installCost.min.toLocaleString('pl-PL')}–${installCost.max.toLocaleString('pl-PL')} zł` }, ].map((s, i) => (

{s.label}

{s.value}

))}
{results.length > 0 ? (
{results.map(product => { const mocChlodnicza = parseFloat( String(product.specs?.['Moc chłodnicza'] || '0').replace(',', '.').split('–')[0] ); const seer = mocChlodnicza > 0 ? mocChlodnicza / (mocChlodnicza * 0.5) : 5; const pobor = mocChlodnicza / 5; // szacowany pobór przy SEER~5 const zuzycieMiesiac = (pobor * 8 * 30).toFixed(0); // 8h/dzień 30 dni return (
{product.name} {product.specs?.['Klasa energetyczna'] && ( {product.specs['Klasa energetyczna'].split('/')[0]} )}

{product.brand}

{product.name}

{product.specs?.['Moc chłodnicza'] && ( {product.specs['Moc chłodnicza']} kW )} {product.specs?.['Hałas wewnątrz (dB)'] && ( {product.specs['Hałas wewnątrz (dB)']} dB )}

~{zuzycieMiesiac} kWh/miesiąc (8h/dzień)

{product.price?.toLocaleString('pl-PL')} zł

+ montaż od {installCost.min.toLocaleString('pl-PL')} zł

); })}
) : (

Nie znaleziono produktów dla podanych kryteriów. Spróbuj zwiększyć budżet lub zadzwoń do nas — dobierzemy ofertę indywidualnie.

)}

⚠️ Ceny mają charakter orientacyjny

Podane ceny urządzeń są cenami brutto (23% VAT) i mogą się różnić w zależności od aktualnej dostępności i kursu walut. Koszt montażu jest szacunkowy — ostateczna wycena zależy od specyfiki instalacji.

Zachęcamy do skorzystania z bezpłatnej i niezobowiązującej wyceny. Możesz też przesłać nam zdjęcia pomieszczeń — dobierzemy optymalne rozwiązanie.

); } return (
{/* Header */}

Dobierz urządzenie

Odpowiedz na {STEPS.length} krótkich pytań — pokażemy Ci najlepsze opcje z naszej oferty

{/* Pasek postępu */}
{STEPS.map((s, i) => (
{i < step ? : i + 1}
{i < STEPS.length - 1 &&
}
))}
{/* Karty kroków */}
{/* Krok 0: Typ urządzenia */} {step === 0 && (

Co chcesz zainstalować?

{deviceType === 'pompa' && !pumpFormSent && (

Wypełnij formularz — oddzwonimy w celu ustalenia terminu bezpłatnej i niezobowiązującej wizji lokalnej

setPumpForm(f => ({...f, name: e.target.value}))} />
setPumpForm(f => ({...f, phone: e.target.value}))} />
setPumpForm(f => ({...f, city: e.target.value}))} />