"use client" import { useState, useEffect } from "react" import { useRouter, useParams } from "next/navigation" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { supabase } from "@/lib/supabase" import { useAuth } from "@/contexts/supabase-auth-context" import { formatCurrency } from "@/lib/currency" import { Cpu, HardDrive, MemoryStick, Zap, Monitor, Fan, Clapperboard as Motherboard, ShoppingCart, Mail, ArrowLeft, Loader2, CheckCircle, AlertCircle, MessageSquare, Send, User, } from "lucide-react" import { Alert, AlertDescription } from "@/components/ui/alert" import { Textarea } from "@/components/ui/textarea" import { Separator } from "@/components/ui/separator" const categoryIcons = { CPU: Cpu, Motherboard: Motherboard, "Memory (RAM)": MemoryStick, Storage: HardDrive, "Graphics Card": Monitor, "Power Supply": Zap, Case: HardDrive, Cooling: Fan, } interface Component { component_id: number component_name: string component_price: number component_categories: { category_name: string } retailers: { retailer_name: string retailer_address?: string retailer_phone?: string email?: string } } interface BuildData { build_id: number build_name: string total_price: number date_created: string build_types: { type_name: string } build_components: Array<{ components: Component }> } export default function PurchasePage() { const { id } = useParams() const router = useRouter() const { user } = useAuth() const [buildData, setBuildData] = useState(null) const [isLoading, setIsLoading] = useState(true) const [isSendingEmail, setIsSendingEmail] = useState(false) const [emailSent, setEmailSent] = useState(false) const [emailResult, setEmailResult] = useState<{ retailerEmailsSent?: number; retailerEmailsFailed?: number } | null>(null) const [error, setError] = useState(null) // Conversation state const [conversations, setConversations] = useState([]) const [newMessage, setNewMessage] = useState("") const [selectedRetailer, setSelectedRetailer] = useState(null) const [isSendingMessage, setIsSendingMessage] = useState(false) useEffect(() => { if (!user) { router.push("/login") return } const fetchBuildData = async () => { try { const { data, error: fetchError } = await supabase .from("builds") .select(` build_id, build_name, total_price, date_created, build_types(type_name), build_components( components( component_id, component_name, component_price, component_categories(category_name), retailers( retailer_name, retailer_address, retailer_phone, email ) ) ) `) .eq("build_id", id) .eq("user_id", user.user_id) .single() if (fetchError) throw fetchError if (!data) throw new Error("Build not found") setBuildData(data as BuildData) } catch (err: any) { console.error("Error fetching build:", err) setError(err.message || "Failed to load build details") } finally { setIsLoading(false) } } fetchBuildData() }, [id, user, router]) const handleSendPurchaseEmail = async () => { if (!user || !buildData) return setIsSendingEmail(true) setError(null) try { const { data: { session } } = await supabase.auth.getSession() const response = await fetch("/api/purchase/send-email", { method: "POST", headers: { "Content-Type": "application/json", ...(session?.access_token && { Authorization: `Bearer ${session.access_token}`, }), }, body: JSON.stringify({ buildId: buildData.build_id, userEmail: user.email, }), }) const data = await response.json() if (!response.ok) { throw new Error(data.error || "Failed to send email") } setEmailSent(true) setEmailResult({ retailerEmailsSent: data.retailerEmailsSent || 0, retailerEmailsFailed: data.retailerEmailsFailed || 0 }) } catch (err: any) { console.error("Error sending email:", err) setError(err.message || "Failed to send purchase details email") } finally { setIsSendingEmail(false) } } if (isLoading) { return (
) } if (error && !buildData) { return (
{error}
) } if (!buildData) return null const components = buildData.build_components.map((bc) => bc.components) return (

Purchase Details

Review your build components and purchase information

{error && ( {error} )} {emailSent && (

Purchase details have been sent to your verified email: {user?.email}

{emailResult && emailResult.retailerEmailsSent > 0 && (

✅ Purchase orders have been sent to {emailResult.retailerEmailsSent} retailer(s)

)} {emailResult && emailResult.retailerEmailsFailed > 0 && (

⚠️ {emailResult.retailerEmailsFailed} retailer email(s) failed to send

)}
)}
{/* Main Content */}
{/* Build Summary */} {buildData.build_name} Build Type: {buildData.build_types?.type_name || "Custom"}
{components.map((component, index) => { const categoryName = component.component_categories?.category_name || "Unknown" const Icon = categoryIcons[categoryName as keyof typeof categoryIcons] const retailer = component.retailers return (
{Icon && ( )}

{component.component_name}

{categoryName}

{formatCurrency(component.component_price)}

{retailer && (

Retailer: {retailer.retailer_name}

{retailer.retailer_address && (

Address: {retailer.retailer_address}

)} {retailer.retailer_phone && (

Phone: {retailer.retailer_phone}

)} {retailer.email && (

Email: {retailer.email}

)}
{/* Conversation Section */} {retailer.email && (

Conversation with {retailer.retailer_name}

{selectedRetailer === retailer.email && (
{/* Conversation History */} {getRetailerConversations(retailer.email).length > 0 ? (
{getRetailerConversations(retailer.email).map((conv: any) => (
{conv.senderName} ({conv.senderType === 'user' ? 'You' : 'Retailer'}) {new Date(conv.createdAt).toLocaleString()}

{conv.message}

))}
) : (

No messages yet. Start a conversation!

)} {/* Message Form */}