import { Form, Head, Link, router } from '@inertiajs/react';
import { ArrowLeft, MailCheck } from 'lucide-react';
import { useEffect, useState } from 'react';
import AuthHeading from '@/components/auth/auth-heading';
import OtpCodeInput from '@/components/auth/otp-code-input';
import ResetSteps from '@/components/auth/reset-steps';
import InputError from '@/components/input-error';
import { Spinner } from '@/components/ui/spinner';
import { login } from '@/routes';
import { request } from '@/routes/password';
import { resend, verify } from '@/routes/password/code';

type Props = {
    email: string;
    codeLength: number;
    resendAvailableIn: number;
    status?: string;
};

export default function ForgotPasswordCode({
    email,
    codeLength,
    resendAvailableIn,
    status,
}: Props) {
    const [code, setCode] = useState('');
    const [secondsLeft, setSecondsLeft] = useState(resendAvailableIn);
    const [resending, setResending] = useState(false);

    useEffect(() => {
        if (secondsLeft <= 0) {
            return;
        }

        const timer = setTimeout(() => setSecondsLeft(secondsLeft - 1), 1000);

        return () => clearTimeout(timer);
    }, [secondsLeft]);

    const handleResend = () => {
        router.post(
            resend.url(),
            {},
            {
                preserveScroll: true,
                onStart: () => setResending(true),
                onFinish: () => setResending(false),
                onSuccess: (page) => {
                    setCode('');
                    setSecondsLeft(page.props.resendAvailableIn as number);
                },
            },
        );
    };

    return (
        <>
            <Head title="Check your email" />

            <ResetSteps current={1} />

            <AuthHeading
                icon={MailCheck}
                title="Check your email"
                description={
                    <>
                        If an account exists for{' '}
                        <span className="font-medium text-navy dark:text-white">
                            {email}
                        </span>
                        , you’ll get a {codeLength} digit code.{' '}
                        <Link
                            href={request()}
                            className="font-semibold text-gold-dark hover:underline"
                        >
                            Change email
                        </Link>
                    </>
                }
            />

            {status === 'code-sent' && (
                <div className="mt-6 rounded-lg bg-green-50 px-4 py-3 text-center text-sm font-medium text-green-700 dark:bg-green-500/10 dark:text-green-400">
                    A new code has been sent to your email address.
                </div>
            )}

            <Form
                {...verify.form()}
                className="mt-6"
                onError={() => setCode('')}
            >
                {({ processing, errors }) => (
                    <>
                        <OtpCodeInput
                            value={code}
                            onChange={setCode}
                            length={codeLength}
                        />
                        <InputError
                            message={errors.code}
                            className="mt-3 text-center"
                        />

                        <div className="mt-6 text-center text-sm text-gray-500 dark:text-white/60">
                            Didn’t get the code?{' '}
                            {secondsLeft > 0 ? (
                                <span>
                                    Resend in{' '}
                                    <span className="font-semibold text-navy tabular-nums dark:text-white">
                                        0:{String(secondsLeft).padStart(2, '0')}
                                    </span>
                                </span>
                            ) : (
                                <button
                                    type="button"
                                    onClick={handleResend}
                                    disabled={resending}
                                    className="inline-flex items-center gap-1.5 font-semibold text-navy transition-colors hover:text-gold-dark disabled:opacity-50 dark:text-white"
                                >
                                    {resending && <Spinner />}
                                    {resending ? 'Sending…' : 'Resend code'}
                                </button>
                            )}
                        </div>

                        <button
                            type="submit"
                            disabled={code.length < codeLength || processing}
                            data-test="verify-reset-code-button"
                            className="mt-6 flex h-11 w-full items-center justify-center gap-2 rounded-lg bg-gold text-base font-semibold text-white transition-colors hover:bg-gold-dark disabled:opacity-70"
                        >
                            {processing && <Spinner />}
                            Verify code
                        </button>
                    </>
                )}
            </Form>

            <Link
                href={login()}
                className="mt-6 flex items-center justify-center gap-1.5 text-sm font-semibold transition-colors hover:text-gold-dark"
            >
                <ArrowLeft className="size-4" />
                Back to login
            </Link>
        </>
    );
}
