import type { ReactNode } from 'react';
import { focusLeavesCard } from '../../lib/oba-rules';

/**
 * Cartes dans lesquelles un bouton de la souris vient d'être enfoncé. Le blur
 * que ce clic provoque part DANS LA FOULÉE (action par défaut du mousedown,
 * même tâche) : l'entrée ne vit que jusqu'au prochain tour de boucle.
 * WeakSet sur le nœud DOM : une carte démontée n'y laisse rien.
 */
const pressedCards = new WeakSet<EventTarget>();

interface ObaWindowCardProps {
    /** Appelé quand le focus QUITTE la carte — c'est là que l'éditeur trie la valeur. */
    onFocusLeave: () => void;
    className?: string;
    children: ReactNode;
}

/**
 * Carte d'une échéance OBA : signale quand le focus la QUITTE, pas quand il
 * passe d'un champ à l'autre à l'intérieur (lib/oba-rules.ts →
 * focusLeavesCard, qui dit pourquoi).
 *
 * Module à part pour que le test de rendu d'ObaEditor puisse la doubler et
 * appeler `onFocusLeave` à la main ; ce composant-ci n'a aucun hook, son test
 * l'appelle comme une fonction et joue ses gestionnaires.
 */
export default function ObaWindowCard({ onFocusLeave, className, children }: ObaWindowCardProps) {
    return (
        <div
            className={className}
            onMouseDownCapture={(e) => {
                const card = e.currentTarget;
                pressedCards.add(card);
                setTimeout(() => pressedCards.delete(card), 0);
            }}
            onBlur={(e) => {
                if (focusLeavesCard(e.currentTarget, e.relatedTarget, pressedCards.has(e.currentTarget))) {
                    onFocusLeave();
                }
            }}
        >
            {children}
        </div>
    );
}
