import { FileUploadInput } from '@admin/components/ui/forms/file-upload-input';
import { FormGroup } from '@admin/components/ui/forms/form-group';
import { formClassName, formHelpClassName } from '@admin/components/ui/field-styles';
import { useFormResponse } from '@admin/hooks/use-form-response';
import { useSingletonPermissions } from '@admin/hooks/use-singleton-permissions';
import { dashboardPersistentLayout } from '@admin/layouts/dashboard-page-layout';
import { cn } from '@admin/lib/utils';
import { Head, useForm } from '@inertiajs/react';
import { FormEvent } from 'react';

type BreadcrumbPage = {
    key: string;
    label: string;
    image_only: boolean;
    title: string;
    image: string;
};

type EditBreadcrumbsProps = {
    pages: BreadcrumbPage[];
};

function mediaUrl(path: string): string {
    if (!path) {
        return '/assets/images/breadcrumb/breadcrumb.jpg';
    }

    if (path.startsWith('/') || path.startsWith('http')) {
        return path;
    }

    return `/storage/${path}`;
}

function EditBreadcrumbs({ pages }: EditBreadcrumbsProps) {
    const { canEdit } = useSingletonPermissions('page-breadcrumb');
    const { data, setData, put, processing, errors } = useForm({ pages });
    const action = useFormResponse({ loadingMessage: 'Saving breadcrumbs...' });

    const updatePage = (index: number, field: 'title' | 'image', value: string) => {
        const next = data.pages.map((page, pageIndex) => (pageIndex === index ? { ...page, [field]: value } : page));
        setData('pages', next);
    };

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

        put('/admin/api/page_breadcrumbs', {
            onStart: action.onStart,
            onSuccess: action.onSuccess,
            onError: action.onError,
            preserveScroll: true,
        });
    };

    return (
        <>
            <Head title="Breadcrumbs" />

            <div className="grid grid-cols-12 gap-6">
                <div className="col-span-12">
                    <p className={cn('mb-4', formHelpClassName)}>
                        Each page banner uses a 1920×495 px photo. Room details keeps the room type as its heading. Its parent link uses the Rooms &amp; Suites title.
                    </p>

                    <form className={formClassName} noValidate onSubmit={handleSubmit}>
                        {data.pages.map((page, index) => (
                            <div className="box mb-4" key={page.key}>
                                <div className="box-header">
                                    <h5 className="box-title">{page.label}</h5>
                                </div>
                                <div className="box-body">
                                    {!page.image_only && (
                                        <FormGroup
                                            label="Title"
                                            error={errors[`pages.${index}.title` as keyof typeof errors] as string | undefined}
                                            inputProps={{
                                                value: page.title,
                                                onChange: (event) => updatePage(index, 'title', event.target.value),
                                                required: true,
                                            }}
                                        />
                                    )}
                                    {page.image_only && (
                                        <p className={cn('mb-4', formHelpClassName)}>The heading is the room type name.</p>
                                    )}
                                    <FileUploadInput
                                        label="Background (1920×495 px recommended)"
                                        inputId={`breadcrumb-${page.key}`}
                                        uploadUrl="/admin/api/upload_page_breadcrumb"
                                        previewUrl={mediaUrl(page.image)}
                                        error={errors[`pages.${index}.image` as keyof typeof errors] as string | undefined}
                                        helpText="Until a photo is uploaded, the page uses the current breadcrumb background."
                                        onSuccess={(filename) => updatePage(index, 'image', filename)}
                                    />
                                </div>
                            </div>
                        ))}

                        {canEdit && (
                            <button type="submit" className="ti-btn ti-btn-primary" disabled={processing}>
                                Save changes
                            </button>
                        )}
                    </form>
                </div>
            </div>
        </>
    );
}

export default Object.assign(EditBreadcrumbs, {
    layout: dashboardPersistentLayout('Breadcrumbs', 'Banner title and background for each public page'),
});
