import AdminLayout from '@/Layouts/AdminLayout';
import { ConfirmDialog } from '@/components/ui/confirm-dialog';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Head, router } from '@inertiajs/react';
import { useState } from 'react';
import ActivityTab from './components/ActivityTab';
import BillingTab from './components/BillingTab';
import ChangePlanDialog from './components/ChangePlanDialog';
import ExtendTrialDialog from './components/ExtendTrialDialog';
import OverviewTab from './components/OverviewTab';
import TeamTab from './components/TeamTab';
import TenantHeader from './components/TenantHeader';
import UsageTab from './components/UsageTab';
import type {
    ActivityEntry,
    InvoiceRow,
    Member,
    TenantDetail,
    TenantPlan,
    TenantSubscription,
    TenantUsage,
} from './components/types';

interface Props {
    tenant: TenantDetail;
    members: Member[];
    subscription: TenantSubscription | null;
    invoices: InvoiceRow[];
    usage: TenantUsage;
    activity: ActivityEntry[];
    plans: TenantPlan[];
}

export default function TenantsShow({
    tenant,
    members,
    subscription,
    invoices,
    usage,
    activity,
    plans,
}: Props) {
    const isSuspended = tenant.status === 'suspended';

    const [confirmSuspend, setConfirmSuspend] = useState(false);
    const [confirmDelete, setConfirmDelete] = useState(false);
    const [showExtendTrial, setShowExtendTrial] = useState(false);
    const [showChangePlan, setShowChangePlan] = useState(false);
    const [busy, setBusy] = useState(false);

    const act = (
        method: 'post' | 'patch' | 'delete',
        path: string,
        data: Record<string, string | number> = {},
        onDone?: () => void,
    ) => {
        setBusy(true);
        const options = {
            preserveScroll: true,
            onFinish: () => {
                setBusy(false);
                onDone?.();
            },
        };
        const url = `/admin/tenants/${tenant.id}${path}`;
        if (method === 'delete') {
            router.delete(url, options);
        } else {
            router[method](url, data, options);
        }
    };

    return (
        <AdminLayout title={tenant.name}>
            <Head title={tenant.name} />

            <div className="space-y-6 p-6 lg:p-8">
                <TenantHeader
                    tenant={tenant}
                    hasSubscription={subscription !== null}
                    isSuspended={isSuspended}
                    onReactivate={() => act('post', '/reactivate')}
                    onSuspend={() => setConfirmSuspend(true)}
                    onExtendTrial={() => setShowExtendTrial(true)}
                    onChangePlan={() => setShowChangePlan(true)}
                    onDelete={() => setConfirmDelete(true)}
                />

                <Tabs defaultValue="overview">
                    <TabsList>
                        <TabsTrigger value="overview">Overview</TabsTrigger>
                        <TabsTrigger value="team">
                            Team ({members.length})
                        </TabsTrigger>
                        <TabsTrigger value="billing">Billing</TabsTrigger>
                        <TabsTrigger value="usage">Usage</TabsTrigger>
                        <TabsTrigger value="activity">Activity</TabsTrigger>
                    </TabsList>

                    <TabsContent value="overview" className="mt-6">
                        <OverviewTab
                            tenant={tenant}
                            subscription={subscription}
                        />
                    </TabsContent>

                    <TabsContent value="team" className="mt-6">
                        <TeamTab members={members} />
                    </TabsContent>

                    <TabsContent value="billing" className="mt-6">
                        <BillingTab invoices={invoices} />
                    </TabsContent>

                    <TabsContent value="usage" className="mt-6 space-y-6">
                        <UsageTab usage={usage} />
                    </TabsContent>

                    <TabsContent value="activity" className="mt-6">
                        <ActivityTab activity={activity} />
                    </TabsContent>
                </Tabs>
            </div>

            <ConfirmDialog
                open={confirmSuspend}
                onOpenChange={setConfirmSuspend}
                title="Suspend this tenant?"
                description={`${tenant.name} will lose access until reactivated.`}
                confirmLabel="Suspend"
                loading={busy}
                onConfirm={() =>
                    act('post', '/suspend', {}, () => setConfirmSuspend(false))
                }
            />

            <ConfirmDialog
                open={confirmDelete}
                onOpenChange={setConfirmDelete}
                title="Delete this tenant?"
                description={`${tenant.name} and its subscription will be soft-deleted. This removes the tenant from all listings.`}
                confirmLabel="Delete tenant"
                loading={busy}
                onConfirm={() => act('delete', '')}
            />

            <ExtendTrialDialog
                open={showExtendTrial}
                onOpenChange={setShowExtendTrial}
                tenantName={tenant.name}
                busy={busy}
                onSubmit={(days) =>
                    act('post', '/extend-trial', { days }, () =>
                        setShowExtendTrial(false),
                    )
                }
            />

            <ChangePlanDialog
                open={showChangePlan}
                onOpenChange={setShowChangePlan}
                tenantName={tenant.name}
                plans={plans}
                initialPlanId={subscription?.plan?.id ?? ''}
                initialBillingCycle={subscription?.billing_cycle ?? 'monthly'}
                busy={busy}
                onSubmit={(planId, billingCycle) =>
                    act(
                        'patch',
                        '/plan',
                        { plan_id: planId, billing_cycle: billingCycle },
                        () => setShowChangePlan(false),
                    )
                }
            />
        </AdminLayout>
    );
}
