import { Head, useForm } from '@inertiajs/react';
import { FormEventHandler } from 'react';

import { Button } from '@admin/components/ui/button';
import { FormError } from '@admin/components/ui/form-error';
import { Input } from '@admin/components/ui/input';
import { Label } from '@admin/components/ui/label';
import { TextLink } from '@admin/components/ui/text-link';
import { formClassName } from '@admin/components/ui/field-styles';
import AuthLayout from '@admin/layouts/auth-layout';

interface PasswordResetVerifyCodeProps {
    email: string;
    status?: string;
}

export default function PasswordResetVerifyCode({ email, status }: PasswordResetVerifyCodeProps) {
    const verifyForm = useForm({
        email,
        code: '',
    });

    const resendForm = useForm({
        email,
    });

    const submitVerify: FormEventHandler = (e) => {
        e.preventDefault();
        verifyForm.post(route('password.verify-code.store'));
    };

    const submitResend: FormEventHandler = (e) => {
        e.preventDefault();
        resendForm.post(route('password.verify-code.resend'), {
            preserveScroll: true,
        });
    };

    return (
        <AuthLayout
            title="Enter verification code"
            description={
                <>
                    We sent a 6-digit code to <span className="font-medium text-gray-800 dark:text-white">{email}</span>.
                    Enter it below to continue.
                </>
            }
        >
            <Head title="Verify reset code" />

            {status && <p className="mb-4 text-center text-sm font-medium text-success">{status}</p>}

            <form onSubmit={submitVerify} className={formClassName}>
                <div className="grid gap-y-4">
                    <input type="hidden" name="email" value={verifyForm.data.email} />

                    <div>
                        <Label htmlFor="code">Verification code</Label>
                        <Input
                            id="code"
                            name="code"
                            type="text"
                            inputMode="numeric"
                            autoComplete="one-time-code"
                            pattern="\d{6}"
                            maxLength={6}
                            required
                            autoFocus
                            placeholder="000000"
                            value={verifyForm.data.code}
                            onChange={(e) => {
                                const digits = e.target.value.replace(/\D/g, '').slice(0, 6);
                                verifyForm.setData('code', digits);
                            }}
                        />
                        <FormError message={verifyForm.errors.code} />
                    </div>

                    <Button type="submit" className="w-full" disabled={verifyForm.processing}>
                        {verifyForm.processing ? 'Verifying…' : 'Verify code'}
                    </Button>
                </div>
            </form>

            <form onSubmit={submitResend} className={`${formClassName} mt-4`}>
                <Button type="submit" variant="secondary" className="w-full" disabled={resendForm.processing}>
                    {resendForm.processing ? 'Sending…' : 'Resend code'}
                </Button>
            </form>

            <p className="mt-5 text-center text-sm text-gray-600 dark:text-white/70">
                Wrong email?{' '}
                <TextLink href={route('password.request')}>Start over</TextLink>
                {' · '}
                <TextLink href={route('login')}>Sign in</TextLink>
            </p>
        </AuthLayout>
    );
}
