import { Head, Link, router } from '@inertiajs/react';
import { useState } from 'react';

import { ConfigurableTable } from '@/components/ui/configurable-table';
import { PaginationLinks } from '@/components/ui/pagination-links';
import { AdminLayout } from '@/layouts/admin-layout';
import type { PaginatedData } from '@/types';

type Option = {
    value: string;
    label: string;
};

type WebhookDeliveryRow = {
    id: number;
    event: string;
    status: string;
    endpoint: {
        name: string;
        url: string;
    } | null;
    attempt_count: number;
    max_attempts: number;
    next_attempt_at: string | null;
    delivered_at: string | null;
    failed_at: string | null;
    response_status: number | null;
    created_at: string | null;
};

type WebhookDeliveryIndexProps = {
    deliveries: PaginatedData<WebhookDeliveryRow>;
    filters: {
        event: string;
        status: string;
    };
    eventOptions: Option[];
    statusOptions: Option[];
};

export default function WebhookDeliveryIndex({
    deliveries,
    filters,
    eventOptions,
    statusOptions,
}: WebhookDeliveryIndexProps) {
    const [event, setEvent] = useState(filters.event || '');
    const [status, setStatus] = useState(filters.status || '');

    const submitFilters = (formEvent: React.FormEvent<HTMLFormElement>) => {
        formEvent.preventDefault();

        router.get(
            '/admin/webhook-deliveries',
            buildParams({ event, status }),
            {
                preserveState: true,
                preserveScroll: true,
                replace: true,
            },
        );
    };

    return (
        <AdminLayout>
            <Head title="Webhook Logs" />

            <div className="space-y-5">
                <div className="flex flex-wrap items-center justify-between gap-3">
                    <div>
                        <h1 className="text-2xl font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                            Webhook Logs
                        </h1>
                        <p className="mt-1 text-sm text-slate-600 dark:text-[#c7bde8]">
                            Inspect delivery attempts, responses, and retries.
                        </p>
                    </div>
                    <Link
                        href="/admin/webhook-endpoints"
                        className="rounded-lg border border-slate-300 px-4 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                    >
                        Endpoints
                    </Link>
                </div>

                <form
                    onSubmit={submitFilters}
                    className="grid gap-2 md:max-w-2xl md:grid-cols-[1fr_180px_auto]"
                >
                    <select
                        value={event}
                        onChange={(changeEvent) =>
                            setEvent(changeEvent.target.value)
                        }
                        className="rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                    >
                        <option value="">All events</option>
                        {eventOptions.map((option) => (
                            <option key={option.value} value={option.value}>
                                {option.label}
                            </option>
                        ))}
                    </select>
                    <select
                        value={status}
                        onChange={(changeEvent) =>
                            setStatus(changeEvent.target.value)
                        }
                        className="rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                    >
                        <option value="">All statuses</option>
                        {statusOptions.map((option) => (
                            <option key={option.value} value={option.value}>
                                {option.label}
                            </option>
                        ))}
                    </select>
                    <button
                        type="submit"
                        className="rounded-lg border border-slate-300 px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                    >
                        Filter
                    </button>
                </form>

                <div className="space-y-3 md:hidden">
                    {deliveries.data.map((delivery) => (
                        <article
                            key={delivery.id}
                            className="rounded-xl border border-slate-200 bg-white p-4 dark:border-[#3c2b68] dark:bg-[#211740]"
                        >
                            <p className="font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                                {delivery.event}
                            </p>
                            <p className="text-xs text-slate-500 dark:text-[#bcaee6]">
                                {delivery.endpoint?.name || 'Deleted endpoint'}
                            </p>
                            <div className="mt-3 grid grid-cols-2 gap-2 text-xs text-slate-700 dark:text-[#c7bde8]">
                                <p>Status: {delivery.status}</p>
                                <p>
                                    Attempts: {delivery.attempt_count}/
                                    {delivery.max_attempts}
                                </p>
                                <p>HTTP: {delivery.response_status || '-'}</p>
                                <p>Created: {delivery.created_at || '-'}</p>
                            </div>
                            <Link
                                href={`/admin/webhook-deliveries/${delivery.id}`}
                                className="mt-4 inline-flex rounded-md border border-slate-300 px-2.5 py-1 text-xs font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                            >
                                View
                            </Link>
                        </article>
                    ))}
                </div>

                <ConfigurableTable
                    tableId="admin-webhook-deliveries"
                    className="hidden overflow-x-auto rounded-xl border border-slate-200 md:block dark:border-[#3c2b68]"
                >
                    <table className="min-w-full divide-y divide-slate-200 text-sm dark:divide-[#3c2b68]">
                        <thead className="bg-slate-50 dark:bg-[#2a1d50]/70">
                            <tr>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Delivery
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Endpoint
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Status
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Attempts
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Actions
                                </th>
                            </tr>
                        </thead>
                        <tbody className="divide-y divide-slate-100 bg-white dark:divide-[#3c2b68] dark:bg-[#211740]">
                            {deliveries.data.map((delivery) => (
                                <tr key={delivery.id}>
                                    <td className="px-4 py-3">
                                        <p className="font-medium text-[#0a1530] dark:text-[#efe8ff]">
                                            {delivery.event}
                                        </p>
                                        <p className="text-xs text-slate-500 dark:text-[#bcaee6]">
                                            Created {delivery.created_at || '-'}
                                        </p>
                                    </td>
                                    <td className="px-4 py-3 text-slate-700 dark:text-[#c7bde8]">
                                        <p>
                                            {delivery.endpoint?.name ||
                                                'Deleted endpoint'}
                                        </p>
                                        <p className="max-w-sm truncate text-xs text-slate-500 dark:text-[#bcaee6]">
                                            {delivery.endpoint?.url || '-'}
                                        </p>
                                    </td>
                                    <td className="px-4 py-3">
                                        <StatusBadge status={delivery.status} />
                                        <p className="mt-1 text-xs text-slate-500 dark:text-[#bcaee6]">
                                            HTTP{' '}
                                            {delivery.response_status || '-'}
                                        </p>
                                    </td>
                                    <td className="px-4 py-3 text-slate-700 dark:text-[#c7bde8]">
                                        <p>
                                            {delivery.attempt_count}/
                                            {delivery.max_attempts}
                                        </p>
                                        <p className="text-xs text-slate-500 dark:text-[#bcaee6]">
                                            Next:{' '}
                                            {delivery.next_attempt_at || '-'}
                                        </p>
                                    </td>
                                    <td className="px-4 py-3">
                                        <Link
                                            href={`/admin/webhook-deliveries/${delivery.id}`}
                                            className="rounded-md border border-slate-300 px-2.5 py-1 text-xs font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                                        >
                                            View
                                        </Link>
                                    </td>
                                </tr>
                            ))}
                        </tbody>
                    </table>
                </ConfigurableTable>

                <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                    <p className="text-sm text-slate-600 dark:text-[#c7bde8]">
                        Showing {deliveries.from || 0} to {deliveries.to || 0}{' '}
                        of {deliveries.total} deliveries
                    </p>
                    <PaginationLinks links={deliveries.links} />
                </div>
            </div>
        </AdminLayout>
    );
}

function StatusBadge({ status }: { status: string }) {
    const classes =
        status === 'delivered'
            ? 'border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-400/40 dark:bg-emerald-400/10 dark:text-emerald-200'
            : status === 'failed'
              ? 'border-rose-200 bg-rose-50 text-rose-700 dark:border-rose-400/40 dark:bg-rose-400/10 dark:text-rose-200'
              : 'border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-400/40 dark:bg-amber-400/10 dark:text-amber-200';

    return (
        <span
            className={`rounded-full border px-2 py-1 text-xs font-semibold ${classes}`}
        >
            {status}
        </span>
    );
}

function buildParams(filters: { event: string; status: string }) {
    const params: Record<string, string> = {};

    if (filters.event !== '') {
        params.event = filters.event;
    }

    if (filters.status !== '') {
        params.status = filters.status;
    }

    return params;
}
