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

import { AdminLayout } from '@/layouts/admin-layout';

type WebhookDelivery = {
    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;
    payload: Record<string, unknown>;
    response_body: string | null;
    error_message: string | null;
};

type WebhookDeliveryShowProps = {
    delivery: WebhookDelivery;
};

export default function WebhookDeliveryShow({
    delivery,
}: WebhookDeliveryShowProps) {
    const retry = () => {
        router.patch(`/admin/webhook-deliveries/${delivery.id}/retry`);
    };

    return (
        <AdminLayout>
            <Head title={`Webhook Delivery #${delivery.id}`} />

            <div className="space-y-5">
                <div className="flex flex-wrap items-start justify-between gap-3">
                    <div>
                        <Link
                            href="/admin/webhook-deliveries"
                            className="text-sm font-medium text-slate-600 hover:text-[#0a1530] dark:text-[#d7c7ff] dark:hover:text-[#efe8ff]"
                        >
                            Back to logs
                        </Link>
                        <h1 className="mt-2 text-2xl font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                            Webhook Delivery #{delivery.id}
                        </h1>
                        <p className="mt-1 text-sm text-slate-600 dark:text-[#c7bde8]">
                            {delivery.event} to{' '}
                            {delivery.endpoint?.name || 'deleted endpoint'}.
                        </p>
                    </div>
                    <div className="flex flex-wrap gap-2">
                        <StatusBadge status={delivery.status} />
                        <button
                            type="button"
                            onClick={retry}
                            disabled={delivery.status === 'delivered'}
                            className="rounded-lg border border-slate-300 px-3 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                        >
                            Retry Delivery
                        </button>
                    </div>
                </div>

                <section className="grid gap-4 lg:grid-cols-4">
                    <InfoCard
                        label="Endpoint"
                        value={delivery.endpoint?.name || 'Deleted endpoint'}
                        detail={delivery.endpoint?.url}
                    />
                    <InfoCard
                        label="Attempts"
                        value={`${delivery.attempt_count}/${delivery.max_attempts}`}
                    />
                    <InfoCard
                        label="HTTP Status"
                        value={
                            delivery.response_status
                                ? String(delivery.response_status)
                                : '-'
                        }
                    />
                    <InfoCard
                        label="Next Attempt"
                        value={delivery.next_attempt_at || '-'}
                    />
                </section>

                <section className="grid gap-4 lg:grid-cols-3">
                    <InfoCard
                        label="Created"
                        value={delivery.created_at || '-'}
                    />
                    <InfoCard
                        label="Delivered"
                        value={delivery.delivered_at || '-'}
                    />
                    <InfoCard
                        label="Failed"
                        value={delivery.failed_at || '-'}
                    />
                </section>

                <section className="grid gap-4 xl:grid-cols-2">
                    <TextBlock
                        label="Payload"
                        value={JSON.stringify(delivery.payload, null, 2)}
                    />
                    <div className="space-y-4">
                        <TextBlock
                            label="Response Body"
                            value={delivery.response_body || ''}
                        />
                        <TextBlock
                            label="Error Message"
                            value={delivery.error_message || ''}
                        />
                    </div>
                </section>
            </div>
        </AdminLayout>
    );
}

function InfoCard({
    label,
    value,
    detail,
}: {
    label: string;
    value: string;
    detail?: string;
}) {
    return (
        <div className="rounded-xl border border-slate-200 bg-slate-50 p-4 dark:border-[#3c2b68] dark:bg-[#160f2d]">
            <p className="text-xs font-semibold tracking-wide text-slate-500 uppercase dark:text-[#bcaee6]">
                {label}
            </p>
            <p className="mt-1 text-sm font-semibold break-all text-[#0a1530] dark:text-[#efe8ff]">
                {value}
            </p>
            {detail ? (
                <p className="mt-1 text-xs break-all text-slate-500 dark:text-[#bcaee6]">
                    {detail}
                </p>
            ) : null}
        </div>
    );
}

function TextBlock({ label, value }: { label: string; value: string }) {
    return (
        <div className="rounded-xl border border-slate-200 bg-white p-4 dark:border-[#3c2b68] dark:bg-[#211740]">
            <h2 className="mb-2 text-sm font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                {label}
            </h2>
            <textarea
                readOnly
                value={value}
                rows={16}
                className="w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2 font-mono text-sm text-[#0a1530] outline-none dark:border-[#3c2b68] dark:bg-[#160f2d] dark:text-[#efe8ff]"
            />
        </div>
    );
}

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-lg border px-3 py-2 text-sm font-semibold ${classes}`}
        >
            {status}
        </span>
    );
}
