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 } from 'react';
import { useFormContext } from 'react-hook-form';
import { toast } from 'sonner';

interface Props {
    emailSettings: {
        mail_driver: string;
        mail_from_address: string;
        mail_from_name: string;
        mail_host: string;
        mail_port: number;
        mail_username: string;
        mail_password: string;
        mail_encryption: string;
    };
}

export default function EmailSettings({ emailSettings }: Props) {
    const page = usePage<any>();

    const handleTestMail = () => {
        router.post(
            '/admin/settings/email/test',
            {},
            {
                preserveScroll: true,
                onSuccess: () => {
                    const success = (usePage().props as any)?.flash?.success;
                    if (success) toast.success(success);
                    const err = (usePage().props as any)?.errors?.email_test;
                    if (err) toast.error(err);
                },
                onError: (errors: any) => {
                    if (errors?.email_test) toast.error(errors.email_test);
                },
            },
        );
    };

    const emailDefaultValues = {
        mail_driver: emailSettings.mail_driver || 'smtp',
        mail_from_address: emailSettings.mail_from_address || '',
        mail_from_name: emailSettings.mail_from_name || '',
        mail_host: emailSettings.mail_host || '',
        mail_port: emailSettings.mail_port || 587,
        mail_username: emailSettings.mail_username || '',
        mail_password: emailSettings.mail_password || '',
        mail_encryption: emailSettings.mail_encryption || 'tls',
    };

    const handleSubmitEmailSettings = async (values: any) => {
        router.post('/admin/settings/email', values, { preserveScroll: true });
    };

    return (
        <>
            <Head title="Email Settings - Admin" />
            <AdminSettingsLayout activeTab="email">
                <div className="space-y-6">
                    <Card className="w-full rounded-lg border border-gray-200 px-5 py-4">
                        <div className="mb-3 border-b pb-3">
                            <HeadingSmall title="Email Settings" description="Configure your application's email configuration" />
                        </div>

                        <CardContent className="w-full px-0">
                            <Form
                                defaultValues={emailDefaultValues}
                                submitHandler={handleSubmitEmailSettings}
                                externalErrors={(page.props as any).errors}
                                formClassNames="space-y-6"
                            >
                                <div className="grid gap-6 md:grid-cols-2">
                                    <FormField
                                        name="mail_driver"
                                        label="Mail Driver"
                                        type="select"
                                        required
                                        options={[
                                            { value: 'smtp', label: 'SMTP' },
                                            { value: 'ses', label: 'Amazon SES' },
                                            { value: 'mailgun', label: 'Mailgun' },
                                            { value: 'log', label: 'Log (Development)' },
                                            { value: 'sendmail', label: 'Sendmail' },
                                        ]}
                                    />
                                    <FormField name="mail_from_address" label="From Email" type="email" placeholder="noreply@example.com" required />
                                    <FormField name="mail_from_name" label="From Name" type="text" placeholder="My SaaS App" required />

                                    <TransportSpecificFields />
                                </div>
                                <div className="flex flex-row flex-wrap items-center gap-2">
                                    <Button type="submit" className="shrink-0 whitespace-nowrap">
                                        <Save className="mr-2 h-4 w-4" />
                                        Save Changes
                                    </Button>
                                    <Button
                                        type="button"
                                        variant="outline"
                                        className="shrink-0 whitespace-nowrap text-success"
                                        onClick={handleTestMail}
                                    >
                                        Test Mail
                                    </Button>
                                </div>
                            </Form>
                        </CardContent>
                    </Card>
                </div>
            </AdminSettingsLayout>
        </>
    );
}

// Renders transport specific credential fields based on selected driver
function TransportSpecificFields() {
    const { watch } = useFormContext();
    const driver = watch('mail_driver');

    if (!driver) return null;

    switch (driver) {
        case 'smtp':
            return (
                <>
                    <FormField name="mail_host" label="Mail Host" type="text" placeholder="smtp.example.com" required />
                    <FormField name="mail_port" label="Mail Port" type="number" placeholder="587" required />
                    <FormField name="mail_username" label="Username" type="text" placeholder="username" required />
                    <FormField name="mail_password" label="Password" type="password" placeholder="password" required />
                    <FormField name="mail_encryption" label="Encryption" type="text" placeholder="tls / ssl / null" required />
                </>
            );
        case 'ses':
            return (
                <>
                    <FormField name="mail_host" label="Endpoint (optional)" type="text" placeholder="email.us-east-1.amazonaws.com" />
                    <FormField name="mail_encryption" label="Encryption" type="text" placeholder="tls / ssl / null" />
                </>
            );
        case 'mailgun':
            return (
                <>
                    <FormField name="mail_host" label="Mailgun Host" type="text" placeholder="smtp.mailgun.org" />
                    <FormField name="mail_username" label="SMTP Username" type="text" placeholder="postmaster@domain" />
                    <FormField name="mail_password" label="SMTP Password" type="password" placeholder="password" />
                    <FormField name="mail_encryption" label="Encryption" type="text" placeholder="tls / ssl" />
                </>
            );
        case 'sendmail':
            return (
                <>
                    <FormField name="mail_host" label="Sendmail Path" type="text" placeholder="/usr/sbin/sendmail -bs -i" />
                </>
            );
        case 'log':
            return null;
        default:
            return null;
    }
}

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