import { useState, useEffect } from "react"; import { useSearchParams } from "react-router-dom"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Badge } from "@/components/ui/badge"; import { Search, MapPin, Star, Phone, Mail, Globe, Filter, AlertCircle, Calculator, Award, Shield, TrendingUp, Map, Users, Clock, CheckCircle } from "lucide-react"; import Header from "@/components/Header"; import { installerService, analyticsService } from "@/lib/database"; import { cleanAndReseedDatabase } from "@/lib/cleanDatabase"; import { debugDatabase, forceDeleteAll, testConnection } from "@/lib/debugDatabase"; import type { Database } from "@/integrations/supabase/types"; type Installer = Database['public']['Tables']['installers']['Row']; const InstallateurFinden = () => { const [searchParams, setSearchParams] = useSearchParams(); const [installers, setInstallers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchTerm, setSearchTerm] = useState(searchParams.get("search") || ""); const [energyType, setEnergyType] = useState(searchParams.get("type") || "all"); const [location, setLocation] = useState(searchParams.get("location") || ""); // SEO: Add structured data for the page useEffect(() => { // Add structured data for the installer directory const structuredData = { "@context": "https://schema.org", "@type": "ItemList", "name": "Solar- und Wind-Installateure in Deutschland", "description": "Qualifizierte Fachbetriebe für Photovoltaik und Windenergie finden und vergleichen", "url": window.location.href, "numberOfItems": installers.length, "itemListElement": installers.map((installer, index) => ({ "@type": "ListItem", "position": index + 1, "item": { "@type": "LocalBusiness", "name": installer.name, "description": installer.description, "address": { "@type": "PostalAddress", "addressLocality": installer.location }, "telephone": installer.phone, "email": installer.email, "url": installer.website ? `https://${installer.website}` : undefined, "aggregateRating": { "@type": "AggregateRating", "ratingValue": installer.rating, "reviewCount": installer.review_count || 0 }, "hasOfferCatalog": { "@type": "OfferCatalog", "name": `${installer.energy_type === 'solar' ? 'Solar' : 'Wind'}-Installation`, "itemListElement": installer.specialties?.map(specialty => ({ "@type": "Offer", "itemOffered": { "@type": "Service", "name": specialty } })) || [] } } })) }; // Add breadcrumb structured data const breadcrumbData = { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Startseite", "item": window.location.origin }, { "@type": "ListItem", "position": 2, "name": "Installateur finden", "item": window.location.href } ] }; // Insert structured data into the page const script1 = document.createElement('script'); script1.type = 'application/ld+json'; script1.text = JSON.stringify(structuredData); document.head.appendChild(script1); const script2 = document.createElement('script'); script2.type = 'application/ld+json'; script2.text = JSON.stringify(breadcrumbData); document.head.appendChild(script2); // Cleanup function return () => { if (script1.parentNode) script1.parentNode.removeChild(script1); if (script2.parentNode) script2.parentNode.removeChild(script2); }; }, [installers]); // SEO: Update page title and meta description useEffect(() => { const title = "Solar- und Wind-Installateur finden – EnergieProfis Vergleich"; const description = "Qualifizierte Solar- und Windbetriebe direkt vergleichen. Jetzt Anfrage starten! Fachbetriebe finden, Angebote vergleichen & Kosten sparen – Echtzeit-Vergleich online."; document.title = title; // Update or create meta description let metaDesc = document.querySelector('meta[name="description"]'); if (!metaDesc) { metaDesc = document.createElement('meta'); metaDesc.setAttribute('name', 'description'); document.head.appendChild(metaDesc); } metaDesc.setAttribute('content', description); // Add canonical URL let canonical = document.querySelector('link[rel="canonical"]'); if (!canonical) { canonical = document.createElement('link'); canonical.setAttribute('rel', 'canonical'); document.head.appendChild(canonical); } canonical.setAttribute('href', window.location.href); // Add Open Graph tags const ogTags = [ { property: 'og:title', content: title }, { property: 'og:description', content: description }, { property: 'og:type', content: 'website' }, { property: 'og:url', content: window.location.href }, { property: 'og:site_name', content: 'EnergieProfis' } ]; ogTags.forEach(tag => { let meta = document.querySelector(`meta[property="${tag.property}"]`); if (!meta) { meta = document.createElement('meta'); meta.setAttribute('property', tag.property); document.head.appendChild(meta); } meta.setAttribute('content', tag.content); }); }, []); // Load installers from database const loadInstallers = async () => { try { setLoading(true); setError(null); const filters = { energyType: energyType && energyType !== "all" ? energyType : undefined, location: location || undefined, searchTerm: searchTerm || undefined }; const data = await installerService.getInstallers(filters); // If no installers found, automatically seed the database if (!data || data.length === 0) { console.log('No installers found, seeding database...'); try { await cleanAndReseedDatabase(); // Try to load installers again after seeding const reseededData = await installerService.getInstallers(filters); setInstallers(reseededData || []); } catch (seedError) { console.error('Error seeding database:', seedError); setError('Datenbank wird initialisiert. Bitte versuchen Sie es in wenigen Sekunden erneut.'); setInstallers([]); } } else { setInstallers(data); } // Track search event if (searchTerm || energyType !== "all" || location) { analyticsService.trackEvent({ event_type: 'installer_search', page_url: window.location.pathname, event_data: filters, user_agent: navigator.userAgent, session_id: sessionStorage.getItem('session_id') || 'anonymous' }); } } catch (err) { console.error('Error loading installers:', err); setError('Fehler beim Laden der Installateure. Bitte versuchen Sie es später erneut.'); setInstallers([]); } finally { setLoading(false); } }; // Initial load useEffect(() => { loadInstallers(); }, []); // Reload when filters change useEffect(() => { const timeoutId = setTimeout(() => { loadInstallers(); }, 500); // Debounce search return () => clearTimeout(timeoutId); }, [searchTerm, energyType, location]); // Update URL params when filters change useEffect(() => { const params = new URLSearchParams(); if (searchTerm) params.set("search", searchTerm); if (energyType && energyType !== "all") params.set("type", energyType); if (location) params.set("location", location); setSearchParams(params); }, [searchTerm, energyType, location, setSearchParams]); const handleReset = () => { setSearchTerm(""); setEnergyType("all"); setLocation(""); }; // Test connection const handleTestConnection = async () => { await testConnection(); }; // Debug database const handleDebugDatabase = async () => { await debugDatabase(); }; // Force delete all and reseed const handleForceReseed = async () => { try { await forceDeleteAll(); await cleanAndReseedDatabase(); alert('Database forcefully reseeded!'); loadInstallers(); } catch (error) { console.error('Error in force reseed:', error); alert('Error in force reseed. Check console.'); } }; // Clean and reseed with proper German data const handleSeedDatabase = async () => { try { await cleanAndReseedDatabase(); alert('Deutsche Installateure erfolgreich geladen!'); loadInstallers(); // Reload the data } catch (error) { console.error('Error seeding database:', error); alert('Fehler beim Laden der Installateure. Details in der Konsole.'); } }; // Track contact clicks const handleContactClick = async (installerId: string, contactType: string) => { try { await analyticsService.trackContactClick({ installer_id: installerId, contact_type: contactType, page_url: window.location.pathname, user_agent: navigator.userAgent, ip_address: await getClientIP() }); } catch (error) { console.error('Error tracking contact click:', error); } }; // Simple IP detection (fallback) const getClientIP = async (): Promise => { try { const response = await fetch('https://api.ipify.org?format=json'); const data = await response.json(); return data.ip; } catch { return 'unknown'; } }; if (loading) { return (

Installateure werden geladen...

); } if (error) { return (

Fehler beim Laden

{error}

); } return (
{/* Header Navigation */}
{/* SEO-Optimized Page Header */}
{/* H1: Primary SEO heading */}

Finden Sie den besten Solar- oder Wind-Installateur in Ihrer Region

Qualifizierte Fachbetriebe für erneuerbare Energien in Ihrer Nähe finden und vergleichen

{/* SEO: Key benefits and CTAs */}

Angebote vergleichen

Kostenlos & unverbindlich

Fördermöglichkeiten

BAFA, KfW & kommunale Zuschüsse

Verifizierte Experten

Zertifizierte Fachbetriebe

{/* SEO: Rich content section for better indexing */}
{/* SEO Content Block 1: Solar Installation */} Solar-Installation

Photovoltaik-Anlagen für Ihr Zuhause: Von Balkonkraftwerken bis zur kompletten Dachanlage. Aktuelle Förderungen 2025, Kostenvergleich und qualifizierte Installateure in Ihrer Region.

BAFA-Förderung bis 500€
KfW-Kredite mit Tilgungszuschuss
EEG-Vergütung für Überschuss
{/* SEO Content Block 2: Wind Energy */} Windenergie

Kleinwindanlagen für Privatgrundstücke: Genehmigungsverfahren, Schallemission, Mast-Höhen und aktuelle Förderprogramme. Fachbetriebe mit Windenergie-Expertise.

Genehmigung unter 15m Mast
Bundesland-spezifische Vorgaben
Schallemissions-Gutachten
{/* SEO Content Block 3: Regional Benefits */} Regionale Vorteile

Lokale Installateure kennen die regionalen Gegebenheiten, Förderprogramme und Genehmigungsverfahren in Ihrem Bundesland. Persönliche Beratung vor Ort.

Kommunale Förderprogramme
Lokale Genehmigungsrichtlinien
Regionale Preisvergleiche
{/* Search and Filters */} Suche & Filter
setSearchTerm(e.target.value)} className="pl-10" />
setLocation(e.target.value)} className="pl-10" />
{/* SEO: FAQ Section for better content depth */} Häufige Fragen zu Solar- und Wind-Installation

Welche Förderungen gibt es 2025 für Solaranlagen?

BAFA-Förderung für Balkonkraftwerke (bis 500€), KfW-Kredite mit Tilgungszuschuss, EEG-Vergütung für Überschussstrom und kommunale Zuschüsse je nach Bundesland.

Brauche ich eine Genehmigung für eine Kleinwindanlage?

Mast-Höhen unter 15m sind in den meisten Bundesländern genehmigungsfrei. Ab 15m ist ein Bauantrag erforderlich. Schallemissions-Gutachten können nötig sein.

Wie finde ich den besten Installateur in meiner Region?

Nutzen Sie unseren Vergleich: Bewertungen, Erfahrung, Zertifizierungen und regionale Expertise vergleichen. Lokale Installateure kennen die regionalen Vorgaben.

Was kostet eine Solaranlage 2025?

Balkonkraftwerk: 400-800€, Komplette Dachanlage: 8.000-15.000€ je kWp. Preise variieren je nach Region, Anbieter und Ausstattung. Nutzen Sie unseren Kostenrechner.

{/* Debug Section - Only show in development */} {process.env.NODE_ENV === 'development' && ( Debug Tools (Development Only)
)} {error && (

Fehler beim Laden

{error}

{process.env.NODE_ENV === 'development' && ( )}
)} {/* Loading State */} {loading && (

Installateure werden geladen...

)} {/* Results */}

{installers.length} Installateur{installers.length !== 1 ? 'e' : ''} gefunden

{/* Installer Cards */}
{installers.map((installer) => (
{installer.name}
{installer.location}
{installer.rating} ({installer.review_count || 0})
{installer.experience_years || 0} Jahre Erfahrung {installer.verified && ( Verifiziert )}
{installer.energy_type === 'solar' ? 'Solar' : 'Wind'}

{installer.description}

Spezialitäten:

{installer.specialties?.map((specialty, index) => ( {specialty} )) || ( Keine Spezialitäten angegeben )}
{installer.certifications && installer.certifications.length > 0 && (

Zertifizierungen:

{installer.certifications.map((cert, index) => ( {cert} ))}
)}
{installer.website && ( )}
))}
{installers.length === 0 && (

Keine Installateure gefunden, die Ihren Kriterien entsprechen.

)} {/* SEO: Internal linking section */}

Weitere nützliche Tools

Solar-Einsparungsrechner

Berechnen Sie Ihre Solareinsparungen und vergleichen Sie Angebote

Windenergie-Rechner

Windenergie berechnen: Ertrag, Kosten & Angebote vergleichen

); }; export default InstallateurFinden;