import { Head, router, usePage } from '@inertiajs/react';
import { useState } from 'react';
import { PageHeaderActions } from '@/components/page-header-actions';
import { Alert, AlertDescription } from '@/components/ui/alert';
import { Button } from '@/components/ui/button';
import {
    Dialog,
    DialogContent,
    DialogIconClose,
    DialogFooter,
    DialogHeader,
    DialogTitle,
    DialogBody,
} from '@/components/ui/dialog';
import { Icon } from '@/components/ui/icon';
import {
    MailboxesWorkspace,
    type MailboxesDialogMode,
} from '@/features/mailboxes/components/mailboxes-workspace';
import { MailboxAccountFields, useMailboxAccountForm } from '@/features/mailboxes/forms/mailbox-account-form';
import { MailboxServerFields, useMailboxServerForm } from '@/features/mailboxes/forms/mailbox-server-form';
import type { MailboxAccountListItem, MailboxServerListItem, MailboxesSettingsPageProps } from '@/features/mailboxes/types';
import { useI18n } from '@/hooks/use-i18n';

export default function MailboxesSettingsPage() {
    const { t } = useI18n();
    const { mail_servers, mailboxes, clients, encryption_options, protocol_options } =
        usePage<MailboxesSettingsPageProps>().props;
    const [dialog, setDialog] = useState<MailboxesDialogMode | null>(null);

    const closeDialog = () => setDialog(null);

    const toggleActive = (account: MailboxAccountListItem, nextActive: boolean) => {
        router.patch(
            `/admin/settings/mailboxes/${account.id}/toggle`,
            { active: nextActive },
            { preserveScroll: true, preserveState: true },
        );
    };

    const testConnection = (account: MailboxAccountListItem) => {
        router.post(
            `/admin/settings/mailboxes/${account.id}/test-connection`,
            {},
            { preserveScroll: true, preserveState: true },
        );
    };

    const syncMailbox = (account: MailboxAccountListItem) => {
        router.post(
            `/admin/settings/mailboxes/${account.id}/sync`,
            {},
            { preserveScroll: true, preserveState: true },
        );
    };

    const deleteAccount = (account: MailboxAccountListItem) => {
        if (!window.confirm(t('settings.mailboxes.workspace.delete_account_confirm', { name: account.name }))) {
            return;
        }

        router.delete(`/admin/settings/mailboxes/${account.id}`, {
            preserveScroll: true,
            preserveState: true,
        });
    };

    const deleteServer = (server: MailboxServerListItem) => {
        if (server.accounts_count > 0) {
            return;
        }

        if (!window.confirm(t('settings.mailboxes.servers_table.delete_confirm', { name: server.name }))) {
            return;
        }

        router.delete(`/admin/settings/mailboxes/servers/${server.id}`, {
            preserveScroll: true,
            preserveState: true,
        });
    };

    return (
        <>
            <Head title={t('settings.mailboxes.page.head_title')} />

            <section className="space-y-6">
                <PageHeaderActions
                    title={t('settings.mailboxes.page.title')}
                    description={t('settings.mailboxes.page.description')}
                />

                <MailboxesWorkspace
                    servers={mail_servers}
                    accounts={mailboxes}
                    onOpenDialog={setDialog}
                    onDeleteServer={deleteServer}
                    onToggleActive={toggleActive}
                    onTestConnection={testConnection}
                    onSync={syncMailbox}
                    onDeleteAccount={deleteAccount}
                />

                <Dialog open={dialog !== null} onOpenChange={(open) => !open && closeDialog()}>
                    <DialogContent className="w-full gap-0">
                        <DialogHeader>
                            <div className="flex items-start justify-between gap-3">
                                <DialogTitle>
                                    {dialog?.type === 'server'
                                        ? dialog.mode === 'edit'
                                            ? t('settings.mailboxes.dialog.title_edit_server')
                                            : t('settings.mailboxes.dialog.title_create_server')
                                        : dialog?.mode === 'edit'
                                          ? t('settings.mailboxes.dialog.title_edit')
                                          : t('settings.mailboxes.dialog.title_create')}
                                </DialogTitle>
                                <DialogIconClose />
                            </div>
                        </DialogHeader>

                        {dialog?.type === 'server' ? (
                            <MailboxServerDialogContent
                                key={dialog.mode === 'edit' ? `server-edit-${dialog.item?.id}` : 'server-create'}
                                mode={dialog.mode}
                                serverId={dialog.item?.id}
                                initialValues={dialog.item}
                                encryptionOptions={encryption_options}
                                protocolOptions={protocol_options}
                                onCancel={closeDialog}
                            />
                        ) : dialog?.type === 'account' ? (
                            <MailboxAccountDialogContent
                                key={
                                    dialog.mode === 'edit'
                                        ? `account-edit-${dialog.item?.id}`
                                        : `account-create-${dialog.serverId ?? 'new'}`
                                }
                                mode={dialog.mode}
                                mailboxId={dialog.item?.id}
                                initialValues={dialog.item}
                                defaultServerId={dialog.serverId ?? dialog.item?.mailbox_server_id}
                                mailServers={mail_servers}
                                clients={clients}
                                onCancel={closeDialog}
                            />
                        ) : null}
                    </DialogContent>
                </Dialog>
            </section>
        </>
    );
}

function MailboxServerDialogContent({
    mode,
    serverId,
    initialValues,
    encryptionOptions,
    protocolOptions,
    onCancel,
}: {
    mode: 'create' | 'edit';
    serverId?: number;
    initialValues?: MailboxServerListItem;
    encryptionOptions: string[];
    protocolOptions: string[];
    onCancel: () => void;
}) {
    const { t } = useI18n();
    const { form, submit } = useMailboxServerForm({
        mode,
        serverId,
        initialValues,
        onSuccess: onCancel,
    });

    return (
        <>
            <DialogBody>
                <MailboxServerFields form={form} encryptionOptions={encryptionOptions} protocolOptions={protocolOptions} />
            </DialogBody>
            <DialogFooter>
                <Button type="button" variant="outline" onClick={onCancel} disabled={form.processing}>
                    {t('settings.mailboxes.dialog.cancel')}
                </Button>
                <Button type="button" onClick={submit} disabled={form.processing}>
                    {form.processing
                        ? t('settings.mailboxes.dialog.saving')
                        : mode === 'create'
                          ? t('settings.mailboxes.dialog.create')
                          : t('settings.mailboxes.dialog.save')}
                </Button>
            </DialogFooter>
        </>
    );
}

function MailboxAccountDialogContent({
    mode,
    mailboxId,
    initialValues,
    defaultServerId,
    mailServers,
    clients,
    onCancel,
}: {
    mode: 'create' | 'edit';
    mailboxId?: number;
    initialValues?: MailboxAccountListItem;
    defaultServerId?: number;
    mailServers: MailboxServerListItem[];
    clients: Array<{ id: number; name: string }>;
    onCancel: () => void;
}) {
    const { t } = useI18n();
    const { form, submit } = useMailboxAccountForm({
        mode,
        mailboxId,
        initialValues: initialValues as Parameters<typeof useMailboxAccountForm>[0]['initialValues'],
        defaultClientId: clients[0]?.id,
        defaultServerId: defaultServerId ?? mailServers[0]?.id,
        onSuccess: onCancel,
    });

    return (
        <>
            <DialogBody className="space-y-4">
                {mailServers.length === 0 ? (
                    <Alert>
                        <AlertDescription>{t('settings.mailboxes.hint.add_server_first')}</AlertDescription>
                    </Alert>
                ) : null}
                <div className="flex items-start gap-2 rounded-md border border-dashed p-3 text-xs text-muted-foreground">
                    <Icon icon="solar:shield-check-bold-duotone" className="mt-0.5 h-4 w-4" />
                    <p>{t('settings.mailboxes.dialog.password_notice')}</p>
                </div>
                <MailboxAccountFields mode={mode} form={form} mailServers={mailServers} clients={clients} />
            </DialogBody>
            <DialogFooter>
                <Button type="button" variant="outline" onClick={onCancel} disabled={form.processing}>
                    {t('settings.mailboxes.dialog.cancel')}
                </Button>
                <Button type="button" onClick={submit} disabled={form.processing || mailServers.length === 0}>
                    {form.processing
                        ? t('settings.mailboxes.dialog.saving')
                        : mode === 'create'
                          ? t('settings.mailboxes.dialog.create')
                          : t('settings.mailboxes.dialog.save')}
                </Button>
            </DialogFooter>
        </>
    );
}
