/**
 * 「再送信」の連打を止めるクールダウン
 *
 * 1 回押すごとに OTP のレート制限（メール単位・IP 単位）の枠を消費する。
 * 共有回線（オフィス・大学・会場の Wi-Fi）では 1 人の連打が同じ回線の全員を止める。
 *
 * 📌 **これは画面側の予防でしかない。** サーバー側の上限は別に効いている。
 *    JS を切られたら効かないので、保護と数えないこと。
 */
import { useState, useEffect, useCallback, useRef } from '@wordpress/element';

const DEFAULT_SECONDS = 60;

export default function useResendCooldown( seconds = DEFAULT_SECONDS ) {
	const [ remaining, setRemaining ] = useState( 0 );
	const timerRef = useRef( null );

	useEffect( () => {
		if ( remaining <= 0 ) {
			return undefined;
		}
		timerRef.current = setTimeout( () => setRemaining( ( n ) => n - 1 ), 1000 );
		return () => clearTimeout( timerRef.current );
	}, [ remaining ] );

	// アンマウント後に setState しない
	useEffect( () => () => clearTimeout( timerRef.current ), [] );

	const start = useCallback( () => setRemaining( seconds ), [ seconds ] );

	return { remaining, isCoolingDown: remaining > 0, start };
}
