import React, { useState } from 'react'; import { searchCards } from '../services/api'; import { Card } from '../types'; import MagicCard from './MagicCard'; const CardSearch = () => { const [cardName, setCardName] = useState(''); const [text, setText] = useState(''); const [rulesText, setRulesText] = useState(''); const [typeLine, setTypeLine] = useState(''); const [typeMatch, setTypeMatch] = useState('partial'); const [typeInclude, setTypeInclude] = useState(true); const [colors, setColors] = useState({ W: false, U: false, B: false, R: false, G: false, C: false }); const [colorMode, setColorMode] = useState('exactly'); const [commanderColors, setCommanderColors] = useState({ W: false, U: false, B: false, R: false, G: false, C: false }); const [manaCost, setManaCost] = useState({ W: 0, U: 0, B: 0, R: 0, G: 0, C: 0 }); const [manaValue, setManaValue] = useState(''); const [manaValueComparison, setManaValueComparison] = useState('='); const [games, setGames] = useState({ paper: false, arena: false, mtgo: false }); const [format, setFormat] = useState(''); const [formatStatus, setFormatStatus] = useState(''); const [set, setSet] = useState(''); const [block, setBlock] = useState(''); const [rarity, setRarity] = useState({ common: false, uncommon: false, rare: false, mythic: false }); const [criteria, setCriteria] = useState(''); const [criteriaMatch, setCriteriaMatch] = useState('partial'); const [criteriaInclude, setCriteriaInclude] = useState(true); const [price, setPrice] = useState(''); const [currency, setCurrency] = useState('usd'); const [priceComparison, setPriceComparison] = useState('='); const [artist, setArtist] = useState(''); const [flavorText, setFlavorText] = useState(''); const [loreFinder, setLoreFinder] = useState(''); const [language, setLanguage] = useState('en'); const [displayImages, setDisplayImages] = useState(false); const [order, setOrder] = useState('name'); const [showAllPrints, setShowAllPrints] = useState(false); const [includeExtras, setIncludeExtras] = useState(false); const [searchResults, setSearchResults] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const handleSearch = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(null); let query = ''; if (cardName) query += `name:${cardName} `; if (text) query += `o:${text} `; if (rulesText) query += `o:"${rulesText.replace('~', cardName)}" `; if (typeLine) { const typeQuery = typeMatch === 'partial' ? typeLine : `"${typeLine}"`; query += `${typeInclude ? '' : '-'}t:${typeQuery} `; } if (Object.values(colors).some(Boolean)) { const activeColors = Object.keys(colors).filter((key) => colors[key as keyof typeof colors]).join(''); const colorQuery = colorMode === 'exactly' ? `c:${activeColors}` : `color<=${activeColors}`; query += `${colorQuery} `; } if (Object.values(commanderColors).some(Boolean)) { const activeColors = Object.keys(commanderColors).filter((key) => commanderColors[key as keyof typeof commanderColors]).join(''); query += `id:${activeColors} `; } const manaCostString = Object.entries(manaCost) .filter(([, count]) => count > 0) .map(([color, count]) => `{${color}}`.repeat(count)) .join(''); if (manaCostString) query += `m:${manaCostString} `; if (manaValue) query += `mv${manaValueComparison}${manaValue} `; if (Object.values(games).some(Boolean)) { const activeGames = Object.keys(games).filter((key) => games[key as keyof typeof games]).join(','); query += `game:${activeGames} `; } if (format) query += `f:${format} `; if (formatStatus) query += `${formatStatus}:${format} `; if (set) query += `e:${set} `; if (block) query += `b:${block} `; if (Object.values(rarity).some(Boolean)) { const activeRarities = Object.keys(rarity).filter((key) => rarity[key as keyof typeof rarity]).join(','); query += `r:${activeRarities} `; } if (criteria) { const criteriaQuery = criteriaMatch === 'partial' ? criteria : `"${criteria}"`; query += `${criteriaInclude ? '' : '-'}o:${criteriaQuery} `; } if (price) query += `${currency}${priceComparison}${price} `; if (artist) query += `a:${artist} `; if (flavorText) query += `ft:${flavorText} `; if (loreFinder) query += `${loreFinder} `; if (language) query += `lang:${language} `; if (displayImages) query += `display:grid `; if (order) query += `order:${order} `; if (showAllPrints) query += `unique:prints `; if (includeExtras) query += `include:extras `; try { const cards = await searchCards(query.trim()); setSearchResults(cards || []); } catch (err) { setError('Failed to fetch cards.'); console.error('Error fetching cards:', err); } finally { setLoading(false); } }; return (

Card Search

{/* Card Details */}
setCardName(e.target.value)} className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Card Name" /> setText(e.target.value)} className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Text" /> setRulesText(e.target.value)} className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Rules Text (~ for card name)" />
setTypeLine(e.target.value)} className="flex-1 px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Type Line" />
{/* Colors */}

Card Colors

{Object.entries(colors).map(([color, active]) => ( ))}

Commander Colors

{Object.entries(commanderColors).map(([color, active]) => ( ))}
{/* Mana Cost */}
{Object.entries(manaCost).map(([color, count]) => (
{color === 'W' ? 'βšͺ' : color === 'U' ? 'πŸ”΅' : color === 'B' ? '⚫' : color === 'R' ? 'πŸ”΄' : color === 'G' ? '🟒' : '🟀'} setManaCost({ ...manaCost, [color]: parseInt(e.target.value) })} className="w-16 px-2 py-1 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" min="0" />
))}
{/* Stats */}
setManaValue(e.target.value)} className="flex-1 px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Mana Value" />
{/* Games */}

Games

{['paper', 'arena', 'mtgo'].map((game) => ( ))}
{/* Formats */}
{/* Sets */}
setSet(e.target.value)} className="flex-1 px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Set Code" /> setBlock(e.target.value)} className="flex-1 px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Block Code" />
{/* Rarity */}

Rarity

{['common', 'uncommon', 'rare', 'mythic'].map((r) => ( ))}
{/* Criteria */}
setCriteria(e.target.value)} className="flex-1 px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Criteria" />
{/* Prices */}
setPrice(e.target.value)} className="flex-1 px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Price" />
{/* Additional Filters */}
setArtist(e.target.value)} className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Artist" /> setFlavorText(e.target.value)} className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Flavor Text" /> setLoreFinder(e.target.value)} className="w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent text-white" placeholder="Lore Finderβ„’" />
{/* Preferences */}
{loading && (
)} {error && (
{error}
)} {searchResults && searchResults.length > 0 && (
{searchResults.map((card) => (

{card.name}

{card.type_line}

))}
)}
); }; export default CardSearch;