import { Head, router, usePage } from '@inertiajs/react';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';
import { useMemo, type ReactNode } from 'react';
import { Form, FormField } from '@/components/form';
import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { toast } from 'sonner';
import AppLayout from '@/layouts/app-layout';
import SettingsLayout from '@/layouts/settings/layout';
import HeadingSmall from '@/components/heading-small';
import { Activity } from 'lucide-react';
import { ActivityLogSidebar } from '@/components/activity-log/ActivityLogSidebar';
import { useModelActivityLog } from '@/components/activity-log/useModelActivityLog';

declare const route: (...args: any[]) => string;

const schema = yup.object({
    store_id:        yup.string().required('Store ID is required'),
    store_password:  yup.string().required('Store password is required'),
    sandbox:         yup.boolean(),
    api_url:         yup.string().url('Must be a valid URL').required('API URL is required'),
    validation_url:  yup.string().url('Must be a valid URL').required('Validation URL is required'),
});

export default function Edit() {
    const { props } = usePage<any>();
    const activityLogCtl = useModelActivityLog();

    const defaultValues = useMemo(() => ({
        store_id:       props?.sslcommerz?.store_id        ?? '',
        store_password: props?.sslcommerz?.store_password  ?? '',
        sandbox:        props?.sslcommerz?.sandbox         ?? true,
        api_url:        props?.sslcommerz?.api_url         ?? 'https://sandbox.sslcommerz.com',
        validation_url: props?.sslcommerz?.validation_url  ?? '',
    }), [props?.sslcommerz]);

    const handleSubmit = (data: any) => {
        router.post(route('settings.payment-provider.update'), data, {
            preserveScroll: true,
            onSuccess: (page: any) => {
                const success = page.props?.flash?.success;
                if (success) toast.success(success);
            },
            onError: () => toast.error('Failed to save settings'),
        });
    };

    return (
        <>
            <Head title="Payment Provider" />

            <SettingsLayout tab="platform">
                <div className="space-y-6">
                    <Card className="rounded-lg border px-5 py-3">
                        <div className="mb-3 flex items-center justify-between border-b pb-3">
                            <HeadingSmall
                                title="SSLCommerz Settings"
                                description="Configure your SSLCommerz payment gateway credentials"
                            />
                            <Button
                                variant="outline"
                                size="sm"
                                onClick={() =>
                                    activityLogCtl.show({
                                        modelClass: 'Setting',
                                        title: 'Payment Provider Activity',
                                        action: 'payment_provider_updated',
                                    })
                                }
                            >
                                <Activity className="mr-1 h-4 w-4" /> Activity
                            </Button>
                        </div>

                        <CardContent className="px-0">
                            <Form
                                submitHandler={handleSubmit}
                                formClassNames="space-y-4"
                                resolver={yupResolver(schema)}
                                defaultValues={defaultValues}
                            >
                                <FormField
                                    type="text"
                                    name="store_id"
                                    label="Store ID"
                                    placeholder="e.g. taskc69edaa3cd9b56"
                                />

                                <FormField
                                    type="password"
                                    name="store_password"
                                    label="Store Password"
                                    placeholder="e.g. taskc69edaa3cd9b56@ssl"
                                />

                                <FormField
                                    type="text"
                                    name="api_url"
                                    label="API URL"
                                    placeholder="https://sandbox.sslcommerz.com"
                                />

                                <FormField
                                    type="text"
                                    name="validation_url"
                                    label="Validation URL"
                                    placeholder="https://sandbox.sslcommerz.com/validator/api/validationserverAPI.php"
                                />

                                <FormField
                                    type="toggle"
                                    name="sandbox"
                                    toggleLabel="Sandbox mode (test environment)"
                                    className="data-[state=checked]:bg-success"
                                />

                                <div className="flex gap-3 pt-4">
                                    <Button type="submit" className="bg-success px-8 py-2 text-white">
                                        Save Changes
                                    </Button>
                                </div>
                            </Form>
                        </CardContent>
                    </Card>
                </div>
            </SettingsLayout>

            <ActivityLogSidebar
                open={activityLogCtl.open}
                onOpenChange={activityLogCtl.setOpen}
                modelClass={activityLogCtl.modelClass}
                modelId={activityLogCtl.modelId}
                title={activityLogCtl.title}
                action={activityLogCtl.action}
            />
        </>
    );
}

Edit.layout = (page: ReactNode) => (
    <AppLayout
        title="Payment Provider"
        breadcrumbs={[
            { title: 'Home',             href: '/' },
            { title: 'Settings',         href: '#' },
            { title: 'Payment Provider', href: '#' },
        ]}
    >
        {page}
    </AppLayout>
);
