import { Form, FormField } from '@admin/components/form';
import HeadingSmall from '@admin/components/heading-small';
import { Button } from '@admin/components/ui/button';
import { Card, CardContent } from '@admin/components/ui/card';
import AdminLayout from '@admin/layouts/admin/admin-layout';
import AdminSettingsLayout from '@admin/layouts/admin/admin-settings-layout';
import { Head, router, usePage } from '@inertiajs/react';
import { Save } from 'lucide-react';
import { ReactNode, useEffect } from 'react';
import { useFormContext } from 'react-hook-form';

interface Props {
    settings: {
        app_name?: string;
        app_slug?: string;
        app_description?: string;
        app_email?: string;
        app_phone?: string;
        app_country?: string;
        app_address?: string;
        app_city?: string;
        app_state?: string;
        app_zip_code?: string;
        app_timezone?: string;
    };
}
/* slug generator */
/* -----------------------------------
 Slug Generator
----------------------------------- */
const generateSlug = (text: string) =>
    text
        .toLowerCase()
        .trim()
        .replace(/[^\w\s-]/g, '')
        .replace(/[\s_-]+/g, '-')
        .replace(/^-+|-+$/g, '');

/* -----------------------------------
 Slug Sync Component
----------------------------------- */
function SlugSync() {
    const { watch, setValue } = useFormContext();

    const app_name = watch('app_name');

    // Always auto-generate app_slug from app_name
    useEffect(() => {
        if (app_name?.trim()) {
            setValue('app_slug', generateSlug(app_name), { shouldValidate: true });
        }
    }, [app_name, setValue]);

    return null;
}
/* slug generator */

export default function General({ settings }: Props) {
    const { props } = usePage();
    const externalErrors = (props as any)?.errors || {};

    const defaultValues = {
        app_name: settings?.app_name || '',
        app_slug: settings?.app_slug || '',
        app_description: settings?.app_description || '',
        app_email: settings?.app_email || '',
        app_phone: settings?.app_phone || '',
        app_country: settings?.app_country || '',
        app_address: settings?.app_address || '',
        app_city: settings?.app_city || '',
        app_state: settings?.app_state || '',
        app_zip_code: settings?.app_zip_code || '',
        app_timezone: settings?.app_timezone || 'UTC',
    };

    const handleSubmit = (data: any) => {
        const payload: any = { ...data };

        router.post(
            '/admin/settings/general',
            { ...payload, _method: 'put' },
            {
                forceFormData: true,
                preserveScroll: true,
            },
        );
    };

    return (
        <>
            <Head title="General Settings - Admin" />
            <AdminSettingsLayout activeTab="general">
                <Card className="space-y-4 px-5 py-4">
                    <div className="mb-3 border-b pb-3">
                        <HeadingSmall title="General Settings" description="Configure your application's basic information" />
                    </div>

                    <CardContent className="w-full p-0">
                        <Form submitHandler={handleSubmit} defaultValues={defaultValues} externalErrors={externalErrors}>
                            <div className="flex w-full flex-col items-start gap-4 lg:flex-row">
                                {/* Main Form Fields */}
                                <div className="w-full flex-1 space-y-6 rounded-lg border p-4">
                                    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
                                        <FormField type="text" name="app_name" label="Application Name" placeholder="My SaaS App" required />
                                        {/* Slug Auto Sync */}
                                        <SlugSync />

                                        <FormField type="text" name="app_slug" label="Application Slug" placeholder="my_saas_app" required />
                                    </div>

                                    <FormField
                                        type="textarea"
                                        name="app_description"
                                        label="Description"
                                        placeholder="A brief description of your application"
                                        rows={4}
                                    />

                                    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
                                        <FormField type="email" name="app_email" label="Email" placeholder="admin@example.com" />
                                        <FormField type="tel" name="app_phone" label="Phone Number" placeholder="+1 (555) 123-4567" />
                                    </div>

                                    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
                                        <FormField type="text" name="app_country" label="Country" placeholder="United States" />
                                        <FormField type="text" name="app_address" label="Address" placeholder="123 Main Street" />
                                    </div>

                                    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
                                        <FormField type="text" name="app_city" label="City" placeholder="New York" />
                                        <FormField type="text" name="app_state" label="State" placeholder="NY" />
                                    </div>

                                    <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
                                        <FormField type="text" name="app_zip_code" label="Zip/Postal Code" placeholder="10001" />
                                        <FormField
                                            type="select"
                                            name="app_timezone"
                                            label="Timezone"
                                            options={[
                                                { value: 'UTC', label: 'UTC' },
                                                { value: 'America/New_York', label: 'Eastern Time (US)' },
                                                { value: 'America/Chicago', label: 'Central Time (US)' },
                                                { value: 'America/Denver', label: 'Mountain Time (US)' },
                                                { value: 'America/Los_Angeles', label: 'Pacific Time (US)' },
                                                { value: 'Europe/London', label: 'London' },
                                                { value: 'Europe/Paris', label: 'Paris' },
                                                { value: 'Asia/Tokyo', label: 'Tokyo' },
                                                { value: 'Asia/Dubai', label: 'Dubai' },
                                                { value: 'Asia/Dhaka', label: 'Dhaka' },
                                            ]}
                                        />
                                    </div>
                                </div>
                            </div>

                            <div className="mt-4 flex items-center">
                                <Button type="submit" className="w-full px-6 py-2 sm:w-auto sm:px-8">
                                    <Save className="mr-2 h-4 w-4" />
                                    Save Changes
                                </Button>
                            </div>
                        </Form>
                    </CardContent>
                </Card>
            </AdminSettingsLayout>
        </>
    );
}

General.layout = (page: ReactNode) => (
    <AdminLayout
        breadcrumbs={[
            { title: 'Settings', href: '/admin/settings/general' },
            { title: 'General', href: '#' },
        ]}
    >
        {page}
    </AdminLayout>
);
