import { Head } from '@inertiajs/react';
import { useRef } from 'react';
import type { FormEvent } from 'react';
import SecurityController from '@/actions/App/Domains/Shared/Http/Controllers/Settings/SecurityController';
import Heading from '@/components/Heading';
import InputError from '@/components/InputError';
import PasswordInput from '@/components/PasswordInput';
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
import { useYupForm } from '@/hooks/use-yup-form';
import { PASSWORD_HINT } from '@/lib/field-constraints';
import { securityUpdateSchema } from '@/lib/validation/auth';
import { edit } from '@/routes/security';

export default function Security() {
    const passwordInput = useRef<HTMLInputElement>(null);
    const currentPasswordInput = useRef<HTMLInputElement>(null);

    const { data, setData, processing, errors, validateField, submit } =
        useYupForm(securityUpdateSchema, {
            current_password: '',
            password: '',
            password_confirmation: '',
        });

    const handleSubmit = (e: FormEvent) => {
        e.preventDefault();

        submit((form) =>
            form.put(SecurityController.update.url(), {
                preserveScroll: true,
                onSuccess: () => form.reset(),
                onError: (formErrors) => {
                    // Kosongkan lalu fokuskan field yang ditolak server —
                    // password tidak pernah dibiarkan tertinggal di layar.
                    if (formErrors.password) {
                        form.reset('password', 'password_confirmation');
                        passwordInput.current?.focus();
                    }

                    if (formErrors.current_password) {
                        form.reset('current_password');
                        currentPasswordInput.current?.focus();
                    }
                },
            }),
        );
    };

    return (
        <>
            <Head title="Security settings" />

            <h1 className="sr-only">Security settings</h1>

            <div className="space-y-6">
                <Heading
                    variant="small"
                    title="Update password"
                    description="Ensure your account is using a long, random password to stay secure"
                />

                <form onSubmit={handleSubmit} className="space-y-6" noValidate>
                    <div className="grid gap-2">
                        <Label htmlFor="current_password">
                            Current password
                        </Label>

                        <PasswordInput
                            id="current_password"
                            ref={currentPasswordInput}
                            name="current_password"
                            className="mt-1 block w-full"
                            autoComplete="current-password"
                            placeholder="Current password"
                            value={data.current_password}
                            onChange={(e) =>
                                setData('current_password', e.target.value)
                            }
                            onBlur={() => validateField('current_password')}
                        />

                        <InputError message={errors.current_password} />
                    </div>

                    <div className="grid gap-2">
                        <Label htmlFor="password">New password</Label>

                        <PasswordInput
                            id="password"
                            ref={passwordInput}
                            name="password"
                            className="mt-1 block w-full"
                            autoComplete="new-password"
                            placeholder="New password"
                            value={data.password}
                            onChange={(e) =>
                                setData('password', e.target.value)
                            }
                            onBlur={() => validateField('password')}
                        />

                        <p className="text-xs text-muted-foreground">
                            {PASSWORD_HINT}
                        </p>

                        <InputError message={errors.password} />
                    </div>

                    <div className="grid gap-2">
                        <Label htmlFor="password_confirmation">
                            Confirm password
                        </Label>

                        <PasswordInput
                            id="password_confirmation"
                            name="password_confirmation"
                            className="mt-1 block w-full"
                            autoComplete="new-password"
                            placeholder="Confirm password"
                            value={data.password_confirmation}
                            onChange={(e) =>
                                setData('password_confirmation', e.target.value)
                            }
                            onBlur={() =>
                                validateField('password_confirmation')
                            }
                        />

                        <InputError message={errors.password_confirmation} />
                    </div>

                    <div className="flex items-center gap-4">
                        <Button
                            disabled={processing}
                            data-test="update-password-button"
                        >
                            Save password
                        </Button>
                    </div>
                </form>
            </div>
        </>
    );
}

Security.layout = {
    breadcrumbs: [
        {
            title: 'Security settings',
            href: edit(),
        },
    ],
};
