import React, { useState, useEffect } from 'react'; import { useApp } from '../../context/AppContext'; import { BarChart3, TrendingUp, Trophy, Target, Award, ArrowUpRight, Pencil } from 'lucide-react'; import { ResponsiveContainer, BarChart, Bar, XAxis, YAxis, Tooltip, CartesianGrid, PieChart, Pie, Cell } from 'recharts'; import { TurkeyHeatMap } from './TurkeyHeatMap'; import { companyStats, monthlyStats, sectorStats, formatTL } from '../../services/analytics'; const PIE_COLORS = ['#2563eb', '#059669', '#7c3aed', '#d97706', '#dc2626', '#0891b2', '#db2777', '#65a30d']; export const AnalyticsDashboard = () => { const { tenders, userProfile, authUser } = useApp(); const cs = companyStats(tenders); const monthlyData = monthlyStats(tenders); const sektorler = sectorStats(tenders); const pieData = sektorler.slice(0, 6).map((s, i) => ({ name: s.sektor, value: s.count, color: PIE_COLORS[i % PIE_COLORS.length] })); const pieToplam = pieData.reduce((s, p) => s + p.value, 0); // Ciro hedefi hesap bazında tutulur; ortak anahtar hesaplar arası veri sızdırır. const hedefAnahtari = authUser?.email ? `ihaleist_ciro_hedefi:${encodeURIComponent(authUser.email.toLowerCase())}` : null; const [hedef, setHedef] = useState(0); const [hedefYuklenenAnahtar, setHedefYuklenenAnahtar] = useState(null); const [editing, setEditing] = useState(false); useEffect(() => { if (!hedefAnahtari) { setHedef(0); setHedefYuklenenAnahtar(null); return; } try { setHedef(Number(localStorage.getItem(hedefAnahtari) || 0) || 0); } catch { setHedef(0); } setHedefYuklenenAnahtar(hedefAnahtari); }, [hedefAnahtari]); useEffect(() => { if (!hedefAnahtari || hedefYuklenenAnahtar !== hedefAnahtari) return; try { localStorage.setItem(hedefAnahtari, String(hedef)); } catch { /* özel tarama/kota */ } }, [hedef, hedefAnahtari, hedefYuklenenAnahtar]); const hedefYuzde = hedef > 0 ? Math.min(Math.round((cs.wonTotal / hedef) * 100), 100) : 0; return (
{/* Header Banner */}

Analitik Dashboard & Fiyat Isı Haritası

{userProfile.company} — kanban süreçlerinizden hesaplanan gerçek kazanma oranı ve il bazlı ihale yoğunluğu.

{/* KPI Cards & Ciro Target — gerçek (kanban/takip verisinden) */}
Katıldığımız İhaleler
{cs.participated} İhale
Teklif verilen + sonuçlanan
İhale Kazanma Oranımız
%{cs.winRate} {cs.resulted > 0 && ( {cs.won}/{cs.resulted} )}
{cs.resulted > 0 ? `${cs.resulted} sonuçlanan ihaleden` : 'Henüz sonuçlanan ihale yok'}
Toplam Kazanılan Bedel
{formatTL(cs.wonTotal)}
{cs.contracts} sözleşme
{/* Ciro Hedefi — kullanıcı belirler */}
Ciro Hedefi
{editing || hedef === 0 ? (
setHedef(Number(e.target.value) || 0)} placeholder="Hedef bedel (₺)" className="w-full bg-blue-950/60 border border-blue-700 rounded-lg px-2 py-1.5 text-xs text-white placeholder:text-blue-300" />
) : ( <> {formatTL(cs.wonTotal)} / {formatTL(hedef)}
)}
{/* Recharts Row — gerçek veriden */}
{/* Monthly Revenue Chart */}

Aylık İhale Kazanım ve Teklif Hacmi (TL)

{monthlyData.length === 0 ? (

Henüz teklif/sonuç verisi yok

Kanban'da ihaleleri "teklif verildi / kazanıldı / kaybedildi" durumuna aldıkça aylık hacim grafiği oluşur.

) : ( `₺${Math.round(val / 1000)}k`} /> [`₺${value.toLocaleString('tr-TR')}`, '']} /> )}
{/* Sector Distribution Pie */}

Sektörel İhale Dağılımı

{pieData.length === 0 ? (

Sektör dağılımı, ihale verisi yüklendikçe hesaplanır.

) : ( <>
{pieData.map((entry, index) => ( ))} [`${value} ihale`, 'Adet']} />
{pieData.map((item) => (
{item.name} %{pieToplam ? Math.round((item.value / pieToplam) * 100) : 0}
))}
)}
{/* İl bazlı gerçek yoğunluk haritası */}
); };