import { useState, useEffect, useCallback } from 'react' import { Plus, Trash2, Gauge } from 'lucide-react' import { DataTable, PageHeader, ActionMenu, EmptyState } from '@/components/admin' import type { Column } from '@/components/admin' import { Modal } from '@/components/common/Modal' import { adminApi } from '@/api/admin' import { toast } from '@/lib/toast' import { cn } from '@/lib/utils' import type { PlanLimitConfig, AccountOverrideResponse, AccountOverrideCreate } from '@/types/admin' export function PlanLimitsPage() { const [plans, setPlans] = useState([]) const [overrides, setOverrides] = useState([]) const [loading, setLoading] = useState(true) const [editPlan, setEditPlan] = useState(null) const [createOverride, setCreateOverride] = useState(false) const [overrideForm, setOverrideForm] = useState({ account_display_code: '', override_max_trees: null, override_max_sessions_per_month: null, override_max_users: null, note: null, }) const fetchData = useCallback(async () => { setLoading(true) try { const [planData, overrideData] = await Promise.all([ adminApi.listPlanLimits(), adminApi.listAccountOverrides(), ]) setPlans(planData) setOverrides(overrideData) } catch { toast.error('Failed to load plan configuration') } finally { setLoading(false) } }, []) useEffect(() => { fetchData() }, [fetchData]) const handleSavePlan = async () => { if (!editPlan) return try { await adminApi.updatePlanLimits(editPlan) toast.success('Plan limits updated') setEditPlan(null) fetchData() } catch { toast.error('Failed to update plan limits') } } const handleCreateOverride = async () => { try { await adminApi.createAccountOverride(overrideForm) toast.success('Override created') setCreateOverride(false) setOverrideForm({ account_display_code: '', override_max_trees: null, override_max_sessions_per_month: null, override_max_users: null, note: null }) fetchData() } catch { toast.error('Failed to create override') } } const handleDeleteOverride = async (id: string) => { try { await adminApi.deleteAccountOverride(id) toast.success('Override deleted') fetchData() } catch { toast.error('Failed to delete override') } } const planColumns: Column[] = [ { key: 'plan', header: 'Plan', render: (p) => {p.plan} }, { key: 'max_trees', header: 'Max Trees', render: (p) => {p.max_trees ?? 'Unlimited'} }, { key: 'max_sessions', header: 'Sessions/Month', render: (p) => {p.max_sessions_per_month ?? 'Unlimited'} }, { key: 'max_users', header: 'Max Users', render: (p) => {p.max_users ?? 'Unlimited'} }, { key: 'actions', header: '', className: 'w-12', render: (p) => ( ), }, ] const overrideColumns: Column[] = [ { key: 'account', header: 'Account', render: (o) => {o.account_display_code || o.account_id.slice(0, 8)} }, { key: 'max_trees', header: 'Max Trees', render: (o) => {o.override_max_trees ?? '-'} }, { key: 'max_sessions', header: 'Sessions/Month', render: (o) => {o.override_max_sessions_per_month ?? '-'} }, { key: 'max_users', header: 'Max Users', render: (o) => {o.override_max_users ?? '-'} }, { key: 'note', header: 'Note', render: (o) => {o.note || '-'} }, { key: 'actions', header: '', className: 'w-12', render: (o) => ( , onClick: () => handleDeleteOverride(o.id), destructive: true }, ]} /> ), }, ] const inputCn = cn( 'w-full rounded-md border border-white/10 bg-black/50 px-3 py-2 text-sm text-white', 'placeholder:text-white/40 focus:outline-none focus:border-white/30 focus:ring-2 focus:ring-white/20' ) return (

Plan Defaults

p.plan} isLoading={loading} />

Account Overrides

o.id} isLoading={loading} emptyState={} title="No overrides" description="Account-specific limit overrides will appear here." />} />
{/* Edit Plan Modal */} setEditPlan(null)} title={`Edit ${editPlan?.plan} Plan`} size="sm" footer={
} > {editPlan && (
setEditPlan({ ...editPlan, max_trees: e.target.value ? parseInt(e.target.value) : null })} className={inputCn} />
setEditPlan({ ...editPlan, max_sessions_per_month: e.target.value ? parseInt(e.target.value) : null })} className={inputCn} />
setEditPlan({ ...editPlan, max_users: e.target.value ? parseInt(e.target.value) : null })} className={inputCn} />
)}
{/* Create Override Modal */} setCreateOverride(false)} title="Create Account Override" size="sm" footer={
} >
setOverrideForm({ ...overrideForm, account_display_code: e.target.value })} placeholder="e.g. ABC-1234" className={inputCn} />
setOverrideForm({ ...overrideForm, override_max_trees: e.target.value ? parseInt(e.target.value) : null })} className={inputCn} />
setOverrideForm({ ...overrideForm, override_max_sessions_per_month: e.target.value ? parseInt(e.target.value) : null })} className={inputCn} />
setOverrideForm({ ...overrideForm, override_max_users: e.target.value ? parseInt(e.target.value) : null })} className={inputCn} />
setOverrideForm({ ...overrideForm, note: e.target.value || null })} placeholder="Reason for override" className={inputCn} />
) } export default PlanLimitsPage