import { Head, useForm } from '@inertiajs/react';
import type { FormEvent } from 'react';
import Heading from '@/components/heading';
import InputError from '@/components/input-error';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';

type SettingsForm = {
    shop_name: string;
    support_email: string;
    support_phone: string;
    support_phone_secondary: string;
    address: string;
    currency: string;
    facebook_url: string;
    instagram_url: string;
    x_url: string;
    linkedin_url: string;
    youtube_url: string;
    whatsapp_url: string;
    telegram_url: string;
    google_map_iframe: string;
    logo: File | null;
    favicon: File | null;
};

type PageProps = {
    settings: Omit<SettingsForm, 'logo' | 'favicon'> & {
        logo_url: string | null;
        favicon_url: string | null;
    };
};

export default function SettingsIndex({ settings }: PageProps) {
    const form = useForm<SettingsForm>({
        shop_name: settings.shop_name,
        support_email: settings.support_email,
        support_phone: settings.support_phone,
        support_phone_secondary: settings.support_phone_secondary,
        address: settings.address,
        currency: settings.currency,
        facebook_url: settings.facebook_url,
        instagram_url: settings.instagram_url,
        x_url: settings.x_url,
        linkedin_url: settings.linkedin_url,
        youtube_url: settings.youtube_url,
        whatsapp_url: settings.whatsapp_url,
        telegram_url: settings.telegram_url,
        google_map_iframe: settings.google_map_iframe,
        logo: null,
        favicon: null,
    });

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

        form.post('/settings/general/uploads', {
            forceFormData: true,
            preserveScroll: true,
            onSuccess: () =>
                form.setData({ ...form.data, logo: null, favicon: null }),
        });
    };

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

            <div className="flex h-full flex-1 flex-col gap-6 overflow-x-auto p-4">
                <Heading
                    title="Settings"
                    description="Manage general shop settings."
                />

                <form onSubmit={submit} className="max-w-3xl space-y-6">
                    <div className="rounded-lg border p-4">
                        <div className="grid gap-4 sm:grid-cols-2">
                            <div className="grid gap-2">
                                <Label htmlFor="shop_name">Shop name</Label>
                                <Input
                                    id="shop_name"
                                    value={form.data.shop_name}
                                    onChange={(event) =>
                                        form.setData(
                                            'shop_name',
                                            event.target.value,
                                        )
                                    }
                                />
                                <InputError message={form.errors.shop_name} />
                            </div>

                            <div className="grid gap-2">
                                <Label htmlFor="currency">Currency</Label>
                                <Input
                                    id="currency"
                                    value={form.data.currency}
                                    onChange={(event) =>
                                        form.setData(
                                            'currency',
                                            event.target.value.toUpperCase(),
                                        )
                                    }
                                />
                                <InputError message={form.errors.currency} />
                            </div>

                            <div className="grid gap-2">
                                <Label htmlFor="support_email">
                                    Support email
                                </Label>
                                <Input
                                    id="support_email"
                                    type="email"
                                    value={form.data.support_email}
                                    onChange={(event) =>
                                        form.setData(
                                            'support_email',
                                            event.target.value,
                                        )
                                    }
                                />
                                <InputError
                                    message={form.errors.support_email}
                                />
                            </div>

                            <div className="grid gap-2">
                                <Label htmlFor="support_phone">
                                    Primary phone
                                </Label>
                                <Input
                                    id="support_phone"
                                    value={form.data.support_phone}
                                    onChange={(event) =>
                                        form.setData(
                                            'support_phone',
                                            event.target.value,
                                        )
                                    }
                                />
                                <InputError
                                    message={form.errors.support_phone}
                                />
                            </div>

                            <div className="grid gap-2">
                                <Label htmlFor="support_phone_secondary">
                                    Secondary phone
                                </Label>
                                <Input
                                    id="support_phone_secondary"
                                    value={form.data.support_phone_secondary}
                                    onChange={(event) =>
                                        form.setData(
                                            'support_phone_secondary',
                                            event.target.value,
                                        )
                                    }
                                />
                                <InputError
                                    message={
                                        form.errors.support_phone_secondary
                                    }
                                />
                            </div>
                        </div>

                        <div className="mt-4 grid gap-2">
                            <Label htmlFor="address">Address</Label>
                            <Textarea
                                id="address"
                                value={form.data.address}
                                onChange={(event) =>
                                    form.setData('address', event.target.value)
                                }
                            />
                            <InputError message={form.errors.address} />
                        </div>

                        <div className="mt-4 grid gap-4 sm:grid-cols-2">
                            <div className="grid gap-2">
                                <Label htmlFor="logo">Logo</Label>
                                {settings.logo_url && (
                                    <img
                                        src={settings.logo_url}
                                        alt="Current logo"
                                        className="size-16 rounded-md border object-contain p-2"
                                    />
                                )}
                                <Input
                                    id="logo"
                                    type="file"
                                    accept="image/*"
                                    onChange={(event) =>
                                        form.setData(
                                            'logo',
                                            event.target.files?.[0] ?? null,
                                        )
                                    }
                                />
                                <InputError message={form.errors.logo} />
                            </div>

                            <div className="grid gap-2">
                                <Label htmlFor="favicon">Favicon</Label>
                                {settings.favicon_url && (
                                    <img
                                        src={settings.favicon_url}
                                        alt="Current favicon"
                                        className="size-12 rounded-md border object-contain p-2"
                                    />
                                )}
                                <Input
                                    id="favicon"
                                    type="file"
                                    accept="image/*"
                                    onChange={(event) =>
                                        form.setData(
                                            'favicon',
                                            event.target.files?.[0] ?? null,
                                        )
                                    }
                                />
                                <InputError message={form.errors.favicon} />
                            </div>
                        </div>
                    </div>

                    <div className="rounded-lg border p-4">
                        <div>
                            <h2 className="font-semibold">Social links</h2>
                            <p className="mt-1 text-sm text-muted-foreground">
                                Optional links shown in the website footer and
                                contact page.
                            </p>
                        </div>

                        <div className="mt-4 grid gap-4 sm:grid-cols-2">
                            {[
                                ['facebook_url', 'Facebook'],
                                ['instagram_url', 'Instagram'],
                                ['x_url', 'X (Twitter)'],
                                ['linkedin_url', 'LinkedIn'],
                                ['youtube_url', 'YouTube'],
                                ['whatsapp_url', 'WhatsApp'],
                                ['telegram_url', 'Telegram'],
                            ].map(([key, label]) => {
                                const field = key as
                                    | 'facebook_url'
                                    | 'instagram_url'
                                    | 'x_url'
                                    | 'linkedin_url'
                                    | 'youtube_url'
                                    | 'whatsapp_url'
                                    | 'telegram_url';

                                return (
                                    <div key={field} className="grid gap-2">
                                        <Label htmlFor={field}>{label}</Label>
                                        <Input
                                            id={field}
                                            type="url"
                                            placeholder="https://"
                                            value={form.data[field]}
                                            onChange={(event) =>
                                                form.setData(
                                                    field,
                                                    event.target.value,
                                                )
                                            }
                                        />
                                        <InputError
                                            message={form.errors[field]}
                                        />
                                    </div>
                                );
                            })}
                        </div>
                    </div>

                    <div className="rounded-lg border p-4">
                        <div>
                            <h2 className="font-semibold">Google map</h2>
                            <p className="mt-1 text-sm text-muted-foreground">
                                Paste the iframe code from Google Maps. Only its
                                validated map URL will be displayed publicly.
                            </p>
                        </div>

                        <div className="mt-4 grid gap-2">
                            <Label htmlFor="google_map_iframe">
                                Google Maps iframe code
                            </Label>
                            <Textarea
                                id="google_map_iframe"
                                rows={6}
                                placeholder={
                                    '<iframe src="https://www.google.com/maps/embed?pb=..."></iframe>'
                                }
                                value={form.data.google_map_iframe}
                                onChange={(event) =>
                                    form.setData(
                                        'google_map_iframe',
                                        event.target.value,
                                    )
                                }
                            />
                            <InputError
                                message={form.errors.google_map_iframe}
                            />
                        </div>
                    </div>

                    <div className="flex justify-end">
                        <Button disabled={form.processing}>
                            Save settings
                        </Button>
                    </div>
                </form>
            </div>
        </>
    );
}

SettingsIndex.layout = {
    breadcrumbs: [
        {
            title: 'Settings',
            href: '/settings/general',
        },
    ],
};
