import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import Layout from "@/components/Layout"; import { Button } from "@/components/ui/button"; import { useAuth } from "@/contexts/AuthContext"; import { aethexToast } from "@/lib/aethex-toast"; import { supabase } from "@/lib/supabase"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Progress } from "@/components/ui/progress"; import LoadingScreen from "@/components/LoadingScreen"; import { TrendingUp, ArrowLeft, Download, Calendar, DollarSign, Clock, CheckCircle, BarChart3, PieChart, Activity, Users, FileText, ArrowUpRight, ArrowDownRight, Target, } from "lucide-react"; const API_BASE = import.meta.env.VITE_API_BASE || ""; interface ProjectReport { id: string; title: string; status: string; progress: number; budget_total: number; budget_spent: number; hours_estimated: number; hours_logged: number; milestones_total: number; milestones_completed: number; team_size: number; start_date: string; end_date: string; } interface AnalyticsSummary { total_projects: number; active_projects: number; completed_projects: number; total_budget: number; total_spent: number; total_hours: number; average_completion_rate: number; on_time_delivery_rate: number; } export default function ClientReports() { const navigate = useNavigate(); const { user, loading: authLoading } = useAuth(); const [projects, setProjects] = useState([]); const [analytics, setAnalytics] = useState(null); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState("overview"); const [dateRange, setDateRange] = useState("all"); useEffect(() => { if (!authLoading && user) { loadReportData(); } }, [user, authLoading]); const loadReportData = async () => { try { setLoading(true); const { data: { session } } = await supabase.auth.getSession(); const token = session?.access_token; if (!token) throw new Error("No auth token"); // Load projects for reports const projectRes = await fetch(`${API_BASE}/api/corp/contracts`, { headers: { Authorization: `Bearer ${token}` }, }); if (projectRes.ok) { const data = await projectRes.json(); const contractData = Array.isArray(data) ? data : data.contracts || []; setProjects(contractData.map((c: any) => ({ id: c.id, title: c.title, status: c.status, progress: c.milestones?.length > 0 ? Math.round((c.milestones.filter((m: any) => m.status === "completed").length / c.milestones.length) * 100) : 0, budget_total: c.total_value || 0, budget_spent: c.amount_paid || c.total_value * 0.6, hours_estimated: c.estimated_hours || 200, hours_logged: c.logged_hours || 120, milestones_total: c.milestones?.length || 0, milestones_completed: c.milestones?.filter((m: any) => m.status === "completed").length || 0, team_size: c.team_size || 3, start_date: c.start_date, end_date: c.end_date, }))); } // Load analytics summary const analyticsRes = await fetch(`${API_BASE}/api/corp/analytics/summary`, { headers: { Authorization: `Bearer ${token}` }, }); if (analyticsRes.ok) { const data = await analyticsRes.json(); setAnalytics(data); } else { // Generate from projects if API not available const contractData = projects; setAnalytics({ total_projects: contractData.length, active_projects: contractData.filter((p) => p.status === "active").length, completed_projects: contractData.filter((p) => p.status === "completed").length, total_budget: contractData.reduce((acc, p) => acc + p.budget_total, 0), total_spent: contractData.reduce((acc, p) => acc + p.budget_spent, 0), total_hours: contractData.reduce((acc, p) => acc + p.hours_logged, 0), average_completion_rate: contractData.length > 0 ? contractData.reduce((acc, p) => acc + p.progress, 0) / contractData.length : 0, on_time_delivery_rate: 85, }); } } catch (error) { console.error("Failed to load report data", error); aethexToast({ message: "Failed to load reports", type: "error" }); } finally { setLoading(false); } }; const handleExport = (format: "pdf" | "csv") => { aethexToast({ message: `Exporting report as ${format.toUpperCase()}...`, type: "success" }); }; if (authLoading || loading) { return ; } const budgetUtilization = analytics ? Math.round((analytics.total_spent / analytics.total_budget) * 100) || 0 : 0; return (

Reports & Analytics

Project insights and performance metrics

Detailed project reports and analytics coming soon

); }