import React, { useState, useMemo } from 'react'; import { License, AIInsight } from '../types'; import { EditIcon, TrashIcon, CalendarIcon, PriceIcon, UserIcon, BriefcaseIcon, ArrowUpIcon, ArrowDownIcon } from './Icons'; import PriceHistoryChart from './PriceHistoryChart'; import { getAIInsights } from '../graphService'; interface LicenseItemProps { license: License; onEdit?: (license: License) => void; onDelete?: (id: string) => void; isReadOnly?: boolean; } const formatCurrency = (amount: number) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(amount || 0); const formatDate = (dateStr: string | undefined | null) => dateStr ? new Date(dateStr).toLocaleDateString() : 'N/A'; const InfoPill: React.FC<{ icon: React.ReactNode; label: string; value: string; secondary?: React.ReactNode }> = ({ icon, label, value, secondary }) => (
{icon}

{label}

{value}

{secondary}
); const LicenseItem: React.FC = ({ license, onEdit, onDelete, isReadOnly }) => { const [aiInsight, setAiInsight] = useState(null); const [loadingAi, setLoadingAi] = useState(false); const handleGetAIAdvice = async () => { setLoadingAi(true); try { setAiInsight(await getAIInsights(license)); } finally { setLoadingAi(false); } }; // Calculate Price Delta const priceAnalysis = useMemo(() => { if (!license.renewals || license.renewals.length === 0) return null; // Find the most recent renewal entry to compare against const sortedRenewals = [...license.renewals].sort((a, b) => new Date(b.renewalDate).getTime() - new Date(a.renewalDate).getTime() ); const previousPrice = sortedRenewals[0].renewalPrice; if (previousPrice === 0 || license.purchasePrice === previousPrice) return null; const delta = ((license.purchasePrice - previousPrice) / previousPrice) * 100; return { percent: Math.abs(delta).toFixed(1), isIncrease: delta > 0 }; }, [license.purchasePrice, license.renewals]); return (
{!license.isActive &&
Archived
}
{license.files && license.files.length > 0 && (

Attachments

{license.files.map(f => ( {f.fileName} ))}
)}

{license.licenseName}

{license.tags?.map(tag => {tag})}
{license.companyName || 'Global'} {license.vendorName} {license.vendorContact.name && `• ${license.vendorContact.name}`}
{license.vendorContact.email && 📧 {license.vendorContact.email}} {license.vendorContact.phone && 📞 {license.vendorContact.phone}}
{!isReadOnly && (
)}
{aiInsight && (

🤖 Automated Strategy

{aiInsight.advice}

)}
} label="Owner" value={license.responsiblePerson || 'Unassigned'} /> } label="Term Price" value={formatCurrency(license.purchasePrice)} secondary={priceAnalysis && ( {priceAnalysis.isIncrease ? : } {priceAnalysis.percent}% )} /> } label="Start Date" value={formatDate(license.purchaseDate)} /> } label="Renewal/End" value={formatDate(license.endDate)} />

Price Performance Analysis

); }; export default LicenseItem;