import React, { useState, useEffect, useCallback } from 'react'; import { WrenchIcon, PlusCircleIcon, ToolboxIcon, InfoIcon, Trash2Icon, SparklesIcon, BookOpenIcon, CheckCircleIcon } from '../components/icons'; import Spinner from '../components/Spinner'; import { generateToolGuide, generateMaintenanceTips, isAIConfigured } from '../services/geminiService'; import type { ToolRecommendation, UserTool, MaintenanceTips } from '../types'; import { AppStatus, ToolCondition } from '../types'; import { useLocalStorage } from '../hooks/useLocalStorage'; const ToolGuideView: React.FC = () => { const [status, setStatus] = useState(AppStatus.IDLE); const [toolData, setToolData] = useState(null); const [myToolkit, setMyToolkit] = useLocalStorage('user-toolkit', []); const [error, setError] = useState(''); const [activeTab, setActiveTab] = useState<'encyclopedia' | 'toolkit'>('encyclopedia'); const [modalOpen, setModalOpen] = useState(false); const [modalContent, setModalContent] = useState<{toolName: string, tips: MaintenanceTips} | null>(null); const [modalLoading, setModalLoading] = useState(false); const aiConfigured = isAIConfigured(); useEffect(() => { const fetchToolGuide = async () => { if (!aiConfigured) { setStatus(AppStatus.ERROR); setError('Please set your Gemini API key in Settings to load the tool encyclopedia.'); return; } setStatus(AppStatus.ANALYZING); try { const result = await generateToolGuide(); if (result) { setToolData(result); setStatus(AppStatus.SUCCESS); } else { throw new Error('Failed to load tool encyclopedia. The AI may be busy. Please try again.'); } } catch (e: any) { setError(e.message); setStatus(AppStatus.ERROR); } }; fetchToolGuide(); }, [aiConfigured]); const handleAddToToolkit = (tool: ToolRecommendation) => { const newUserTool: UserTool = { ...tool, id: `${tool.name}-${Date.now()}`, condition: ToolCondition.GOOD, }; setMyToolkit(prev => [...prev, newUserTool]); }; const handleRemoveFromToolkit = (toolId: string) => { setMyToolkit(prev => prev.filter(t => t.id !== toolId)); }; const handleUpdateTool = (toolId: string, updatedProps: Partial) => { setMyToolkit(prev => prev.map(t => t.id === toolId ? { ...t, ...updatedProps } : t)); } const handleShowMaintenanceTips = async (tool: UserTool) => { setModalOpen(true); setModalLoading(true); try { const tips = await generateMaintenanceTips(tool.name); if (tips) { setModalContent({ toolName: tool.name, tips }); } else { throw new Error("Could not retrieve tips."); } } catch(e: any) { setModalContent({ toolName: tool.name, tips: { sharpening: e.message, cleaning: "Could not retrieve tips.", storage: "Could not retrieve tips."} }); } finally { setModalLoading(false); } }; const isToolInKit = (toolName: string) => myToolkit.some(t => t.name === toolName); const conditionColors: Record = { [ToolCondition.EXCELLENT]: { bg: 'bg-green-100', text: 'text-green-800', ring: 'ring-green-600' }, [ToolCondition.GOOD]: { bg: 'bg-blue-100', text: 'text-blue-800', ring: 'ring-blue-600' }, [ToolCondition.NEEDS_SHARPENING]: { bg: 'bg-yellow-100', text: 'text-yellow-800', ring: 'ring-yellow-600' }, [ToolCondition.NEEDS_OILING]: { bg: 'bg-orange-100', text: 'text-orange-800', ring: 'ring-orange-600' }, [ToolCondition.DAMAGED]: { bg: 'bg-red-100', text: 'text-red-800', ring: 'ring-red-600' }, }; const renderEncyclopedia = () => { if (status === AppStatus.ANALYZING) return ; if (status === AppStatus.ERROR) return

{error}

; if (!toolData) return null; const groupedTools = toolData.reduce((acc, tool) => { acc[tool.category] = acc[tool.category] || []; acc[tool.category].push(tool); return acc; }, {} as Record); return (
{Object.entries(groupedTools).map(([category, tools]) => (

{category} Tools

{tools.sort((a,b) => { const levels = { 'Essential': 1, 'Recommended': 2, 'Advanced': 3 }; return levels[a.level] - levels[b.level]; }).map(tool => (

{tool.name}

{tool.description}

{tool.level}
))}
))}
); }; const renderMyToolkit = () => { if (myToolkit.length === 0) { return (

Your Toolkit is Empty

Add tools from the "Tool Encyclopedia" tab to start managing your collection.

) } return (
{myToolkit.map(tool => (

{tool.name}

{tool.description}

Last Maintained: {tool.lastMaintained ? new Date(tool.lastMaintained).toLocaleDateString() : 'N/A'}