import { formClassName, formHelpClassName } from '@admin/components/ui/field-styles';
import {
    editPermission,
    userCan,
    viewPermission,
} from '@admin/lib/admin-permissions';
import { cn } from '@admin/lib/utils';
import { useFormResponse } from '@admin/hooks/use-form-response';
import { dashboardPersistentLayout } from '@admin/layouts/dashboard-page-layout';
import {
    MenuBackgroundImagesFormFields,
    type MenuBackgroundImagesFormData,
    type MenuBackgroundUploadSlot,
} from '@admin/pages/customization/menu-background-images/menu-background-images-form-fields';
import { type SharedData } from '@/types';
import { Head, useForm, usePage } from '@inertiajs/react';
import { FormEvent } from 'react';

type EditMenuBackgroundImagesProps = {
    section: MenuBackgroundImagesFormData;
    exists: boolean;
    slots: MenuBackgroundUploadSlot[];
};

function EditMenuBackgroundImages({ section, exists, slots }: EditMenuBackgroundImagesProps) {
    const permissions = usePage<SharedData>().props.auth.user?.permissions;
    const canEdit = userCan(permissions, editPermission('menu-background-images'));
    const canView = userCan(permissions, viewPermission('menu-background-images'));
    const { data, setData, put, processing, errors } = useForm(section);

    const action = useFormResponse({
        loadingMessage: exists ? 'Saving changes...' : 'Saving menu background images...',
    });

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

        put('/admin/api/customization/menu-background-images', {
            onStart: action.onStart,
            onSuccess: action.onSuccess,
            onError: action.onError,
            preserveScroll: true,
        });
    };

    if (!canView) {
        return (
            <>
                <Head title="Menu background images" />
                <p className={formHelpClassName}>You do not have permission to view this page.</p>
            </>
        );
    }

    return (
        <>
            <Head title="Menu background images" />

            <div className="grid grid-cols-12 gap-6">
                <div className="col-span-12">
                    <p className={cn('mb-4', formHelpClassName)}>
                        Upload sidebar backgrounds for the theme customizer. Each slot maps to one preview under
                        &ldquo;Menu With Background Image&rdquo; in the header switcher. Leave a slot empty to keep the
                        default template image.
                    </p>

                    <form className={formClassName} noValidate onSubmit={handleSubmit}>
                        <MenuBackgroundImagesFormFields
                            data={data}
                            errors={errors}
                            setData={setData}
                            slots={slots}
                        />

                        {canEdit && (
                            <button type="submit" className="ti-btn ti-btn-primary" disabled={processing}>
                                {exists ? 'Save changes' : 'Save'}
                            </button>
                        )}
                        {!canEdit && (
                            <p className={formHelpClassName}>You do not have permission to edit menu background images.</p>
                        )}
                    </form>
                </div>
            </div>
        </>
    );
}

export default Object.assign(EditMenuBackgroundImages, {
    layout: dashboardPersistentLayout(
        'Menu background images',
        'Sidebar backgrounds for the theme customizer',
    ),
});
