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

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

const schema = yup.object({
    twilio_sid: yup.string().required('Twilio SID is required'),
    twilio_token: yup.string().required('Twilio Auth Token is required'),
    twilio_from: yup.string().required('Twilio From Number is required'),
    twilio_status: yup.boolean(),
});

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

    const defaultValues = useMemo(
        () => ({
            twilio_sid: props?.twilio?.twilio_sid ?? '',
            twilio_token: props?.twilio?.twilio_token ?? '',
            twilio_from: props?.twilio?.twilio_from ?? '',
            twilio_status: props?.twilio?.twilio_status ?? true,
        }),
        [props?.twilio],
    );

    const handleSubmit = (data: any) => {
        router.post(route('settings.twilio.update'), data, {
            preserveScroll: true,
        });
    };

    return (
        <>
            <Head title="SMS 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="Twilio SMS Settings" description="Configure your Twilio SMS gateway credentials for OTP sending" />

                            <Button
                                variant="outline"
                                size="sm"
                                onClick={() =>
                                    activityLogCtl.show({
                                        modelClass: 'Setting',
                                        title: 'SMS Provider Activity',
                                        action: 'sms_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="twilio_sid" label="Twilio Account SID" placeholder="e.g. ACxxxxxxxxxxxxxxxxxxxxxxxx" />

                                <FormField type="password" name="twilio_token" label="Twilio Auth Token" placeholder="Enter Twilio Auth Token" />

                                <FormField type="text" name="twilio_from" label="Twilio From Number" placeholder="e.g. +15017122661" />

                                <FormField
                                    type="toggle"
                                    name="twilio_status"
                                    toggleLabel="Enable Twilio SMS Provider"
                                    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="SMS Provider"
        breadcrumbs={[
            { title: 'Home', href: '/' },
            { title: 'Settings', href: '#' },
            { title: 'SMS Provider', href: '#' },
        ]}
    >
        {page}
    </AppLayout>
);
