import { useState, useMemo } from 'react';
import { Box, Text, useInput } from 'ink';
import type { CountryDTO } from '@effigenix/api-client';
interface CountryPickerProps {
countries: CountryDTO[];
query: string;
onQueryChange: (q: string) => void;
onSelect: (country: CountryDTO) => void;
focus: boolean;
selectedName?: string;
maxVisible?: number;
}
const DACH_CODES = ['DE', 'AT', 'CH'];
export function CountryPicker({
countries,
query,
onQueryChange,
onSelect,
focus,
selectedName,
maxVisible = 5,
}: CountryPickerProps) {
const [cursor, setCursor] = useState(0);
const filtered = useMemo(() => {
if (!query) {
// Show DACH favorites when no query
return countries.filter((c) => DACH_CODES.includes(c.code)).slice(0, maxVisible);
}
const q = query.toLowerCase();
return countries.filter(
(c) => c.name.toLowerCase().includes(q) || c.code.toLowerCase().includes(q),
).slice(0, maxVisible);
}, [countries, query, maxVisible]);
useInput((input, key) => {
if (!focus) return;
if (key.upArrow) {
setCursor((c) => Math.max(0, c - 1));
return;
}
if (key.downArrow) {
setCursor((c) => Math.min(filtered.length - 1, c + 1));
return;
}
if (key.return && filtered.length > 0) {
const selected = filtered[cursor];
if (selected) onSelect(selected);
return;
}
if (key.backspace || key.delete) {
onQueryChange(query.slice(0, -1));
setCursor(0);
return;
}
if (key.tab || key.escape || key.ctrl || key.meta) return;
if (input && !key.upArrow && !key.downArrow) {
onQueryChange(query + input);
setCursor(0);
}
}, { isActive: focus });
if (!focus && selectedName) {
return (
Land *
›
✓ {selectedName}
);
}
if (focus && selectedName && !query) {
return (
Land * (tippen zum Ändern)
›
✓ {selectedName}
{filtered.length > 0 && (
{filtered.map((c, i) => (
{i === cursor ? '▶ ' : ' '}{c.code} – {c.name}
))}
)}
);
}
return (
Land * (Suche)
›
{query || (focus ? '▌' : '')}
{focus && filtered.length > 0 && (
{filtered.map((c, i) => (
{i === cursor ? '▶ ' : ' '}{c.code} – {c.name}
))}
)}
{focus && query && filtered.length === 0 && (
Kein Land gefunden.
)}
);
}