{"version":3,"sources":["../../src/features/billing/components/cards/SubscriptionSummaryCard.tsx","../../src/features/billing/components/cards/PaymentMethodSummaryCard.tsx","../../src/features/billing/components/cards/CustomerInfoCard.tsx","../../src/features/billing/components/cards/InvoicesSummaryCard.tsx","../../src/features/billing/components/cards/BillingUsageSummaryCard.tsx","../../src/features/billing/components/containers/BillingDashboardContainer.tsx","../../src/features/billing/stripe-customer/components/containers/PaymentMethodsContainer.tsx","../../src/features/billing/stripe-customer/components/forms/PaymentMethodForm.tsx","../../src/features/billing/stripe-customer/components/forms/PaymentMethodEditor.tsx","../../src/features/billing/stripe-customer/components/details/PaymentMethodCard.tsx","../../src/features/billing/stripe-customer/components/lists/PaymentMethodsList.tsx","../../src/features/billing/stripe-invoice/components/containers/InvoicesContainer.tsx","../../src/features/billing/stripe-invoice/components/lists/InvoicesList.tsx","../../src/features/billing/components/utils/date.ts","../../src/features/billing/stripe-invoice/components/details/InvoiceDetails.tsx","../../src/features/billing/stripe-invoice/components/widgets/InvoiceStatusBadge.tsx","../../src/features/billing/stripe-subscription/components/containers/SubscriptionsContainer.tsx","../../src/features/billing/stripe-subscription/components/lists/SubscriptionsList.tsx","../../src/features/billing/stripe-subscription/components/details/SubscriptionDetails.tsx","../../src/features/billing/stripe-subscription/components/forms/CancelSubscriptionDialog.tsx","../../src/features/billing/stripe-subscription/components/widgets/SubscriptionStatusBadge.tsx","../../src/features/billing/stripe-subscription/components/widgets/IntervalToggle.tsx","../../src/features/billing/stripe-subscription/components/widgets/PricingCard.tsx","../../src/features/billing/stripe-subscription/components/widgets/ProductPricingRow.tsx","../../src/features/billing/stripe-subscription/components/widgets/ProductPricingList.tsx","../../src/features/billing/stripe-subscription/components/widgets/ProrationPreview.tsx","../../src/features/billing/stripe-subscription/components/widgets/SubscriptionConfirmation.tsx","../../src/features/billing/stripe-subscription/components/wizards/SubscriptionWizard.tsx","../../src/features/billing/stripe-subscription/hooks/useSubscriptionWizard.ts","../../src/features/billing/stripe-subscription/components/wizards/WizardProgressIndicator.tsx","../../src/features/billing/stripe-subscription/components/wizards/WizardStepPlanSelection.tsx","../../src/features/billing/stripe-subscription/components/wizards/WizardStepReview.tsx","../../src/features/billing/stripe-promotion-code/components/PromoCodeInput.tsx","../../src/features/billing/stripe-subscription/components/wizards/WizardStepPaymentMethod.tsx","../../src/features/billing/stripe-usage/components/containers/UsageContainer.tsx","../../src/features/billing/stripe-usage/components/details/UsageSummaryCard.tsx","../../src/features/billing/stripe-usage/components/widgets/UsageSummaryCards.tsx","../../src/features/billing/stripe-usage/components/lists/UsageHistoryTable.tsx","../../src/features/billing/components/modals/BillingDetailModal.tsx","../../src/features/billing/components/widgets/BillingAlertBanner.tsx","../../src/features/billing/components/providers/StripeProvider.tsx","../../src/features/billing/contexts/PriceContext.tsx","../../src/features/billing/stripe-price/components/forms/PriceArchiver.tsx","../../src/features/billing/stripe-price/components/forms/PriceEditor.tsx","../../src/features/billing/contexts/ProductContext.tsx","../../src/features/billing/stripe-product/components/forms/ProductArchiver.tsx","../../src/features/billing/stripe-product/components/forms/ProductEditor.tsx","../../src/features/billing/stripe-price/components/details/PriceDetails.tsx","../../src/features/billing/stripe-price/components/containers/PriceContainer.tsx","../../src/features/billing/stripe-price/components/lists/PricesList.tsx","../../src/features/billing/stripe-product/components/containers/ProductContainer.tsx","../../src/features/billing/stripe-product/components/details/ProductDetails.tsx","../../src/features/billing/stripe-product/components/lists/ProductsList.tsx","../../src/features/billing/stripe-product/components/containers/ProductsListContainer.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronRight, CreditCard } from \"lucide-react\";\nimport { Badge, Button, Card, CardContent, CardHeader, CardTitle, Skeleton } from \"../../../../shadcnui\";\nimport { StripeSubscriptionInterface, SubscriptionStatus } from \"../../stripe-subscription\";\n\ntype SubscriptionSummaryCardProps = {\n  subscriptions: StripeSubscriptionInterface[];\n  loading?: boolean;\n  error?: string;\n  onManageClick: () => void;\n};\n\nfunction getStatusBadgeVariant(status: SubscriptionStatus): \"default\" | \"secondary\" | \"destructive\" | \"outline\" {\n  switch (status) {\n    case SubscriptionStatus.ACTIVE:\n      return \"default\";\n    case SubscriptionStatus.TRIALING:\n      return \"secondary\";\n    case SubscriptionStatus.PAST_DUE:\n    case SubscriptionStatus.UNPAID:\n    case SubscriptionStatus.CANCELED:\n      return \"destructive\";\n    default:\n      return \"outline\";\n  }\n}\n\nfunction formatDate(date: Date): string {\n  return new Date(date).toLocaleDateString(undefined, {\n    year: \"numeric\",\n    month: \"short\",\n    day: \"numeric\",\n  });\n}\n\nfunction formatPlanName(subscription: StripeSubscriptionInterface): string {\n  const productName = subscription.price?.product?.name || \"\";\n  const nickname = subscription.price?.nickname || \"\";\n\n  if (productName && nickname) {\n    return `${productName} - ${nickname}`;\n  }\n  return productName || nickname || \"Subscription\";\n}\n\nexport function SubscriptionSummaryCard({\n  subscriptions,\n  loading,\n  error,\n  onManageClick,\n}: SubscriptionSummaryCardProps) {\n  if (loading) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Subscriptions</CardTitle>\n          <CreditCard className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <Skeleton className=\"h-6 w-32 mb-2\" />\n          <Skeleton className=\"h-4 w-24 mb-1\" />\n          <Skeleton className=\"h-4 w-40\" />\n        </CardContent>\n      </Card>\n    );\n  }\n\n  if (error) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Subscriptions</CardTitle>\n          <CreditCard className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <p className=\"text-destructive text-xs/relaxed\">{error}</p>\n        </CardContent>\n      </Card>\n    );\n  }\n\n  const activeSubscriptions = subscriptions.filter(\n    (sub) => sub.status === SubscriptionStatus.ACTIVE || sub.status === SubscriptionStatus.TRIALING,\n  );\n  const primarySubscription = activeSubscriptions[0];\n\n  return (\n    <Card className=\"cursor-pointer hover:bg-accent/50 transition-colors\" onClick={onManageClick}>\n      <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n        <CardTitle>Subscriptions</CardTitle>\n        <CreditCard className=\"h-4 w-4 text-muted-foreground\" />\n      </CardHeader>\n      <CardContent>\n        {subscriptions.length === 0 ? (\n          <div className=\"space-y-2\">\n            <p className=\"text-xl font-bold text-muted-foreground\">No active plan</p>\n            <p className=\"text-xs text-muted-foreground\">Subscribe to get started</p>\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              className=\"mt-2\"\n              onClick={(e) => {\n                e.stopPropagation();\n                onManageClick();\n              }}\n            >\n              View Plans\n              <ChevronRight className=\"h-4 w-4 ml-1\" />\n            </Button>\n          </div>\n        ) : primarySubscription ? (\n          <div className=\"space-y-2\">\n            <div className=\"flex items-center gap-2\">\n              <p className=\"text-xl font-bold\">{formatPlanName(primarySubscription)}</p>\n              <Badge\n                variant={\n                  primarySubscription.cancelAtPeriodEnd\n                    ? \"secondary\"\n                    : getStatusBadgeVariant(primarySubscription.status)\n                }\n              >\n                {primarySubscription.cancelAtPeriodEnd ? \"Canceling\" : primarySubscription.status}\n              </Badge>\n            </div>\n            <p className=\"text-xs text-muted-foreground\">\n              {!primarySubscription.price?.isTrial\n                ? `Ends on ${formatDate(primarySubscription.currentPeriodEnd)}`\n                : primarySubscription.cancelAtPeriodEnd\n                  ? `Cancels on ${formatDate(primarySubscription.currentPeriodEnd)}`\n                  : `Renews on ${formatDate(primarySubscription.currentPeriodEnd)}`}\n            </p>\n            {activeSubscriptions.length > 1 && (\n              <p className=\"text-xs text-muted-foreground\">+{activeSubscriptions.length - 1} more subscription(s)</p>\n            )}\n          </div>\n        ) : null}\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { Wallet, ChevronRight } from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle, Button, Skeleton } from \"../../../../shadcnui\";\nimport { PaymentMethodInterface } from \"../../stripe-customer\";\n\ntype PaymentMethodSummaryCardProps = {\n  paymentMethods: PaymentMethodInterface[];\n  defaultPaymentMethodId?: string;\n  loading?: boolean;\n  error?: string;\n  onManageClick: () => void;\n};\n\nfunction getCardBrandIcon(brand: string): string {\n  const brandMap: Record<string, string> = {\n    visa: \"Visa\",\n    mastercard: \"Mastercard\",\n    amex: \"Amex\",\n    discover: \"Discover\",\n    diners: \"Diners\",\n    jcb: \"JCB\",\n    unionpay: \"UnionPay\",\n  };\n  return brandMap[brand.toLowerCase()] || brand;\n}\n\nexport function PaymentMethodSummaryCard({\n  paymentMethods,\n  defaultPaymentMethodId,\n  loading,\n  error,\n  onManageClick,\n}: PaymentMethodSummaryCardProps) {\n  if (loading) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Payment Method</CardTitle>\n          <Wallet className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <Skeleton className=\"h-6 w-32 mb-2\" />\n          <Skeleton className=\"h-4 w-24\" />\n        </CardContent>\n      </Card>\n    );\n  }\n\n  if (error) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Payment Method</CardTitle>\n          <Wallet className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <p className=\"text-destructive text-xs/relaxed\">{error}</p>\n        </CardContent>\n      </Card>\n    );\n  }\n\n  // Find default payment method or use first one\n  const defaultMethod = paymentMethods.find((pm) => pm.id === defaultPaymentMethodId) || paymentMethods[0];\n\n  return (\n    <Card className=\"cursor-pointer hover:bg-accent/50 transition-colors\" onClick={onManageClick}>\n      <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n        <CardTitle>Payment Method</CardTitle>\n        <Wallet className=\"h-4 w-4 text-muted-foreground\" />\n      </CardHeader>\n      <CardContent>\n        {paymentMethods.length === 0 ? (\n          <div className=\"space-y-2\">\n            <p className=\"text-xl font-bold text-muted-foreground\">No payment method</p>\n            <p className=\"text-xs text-muted-foreground\">Add a card to enable subscriptions</p>\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              className=\"mt-2\"\n              onClick={(e) => {\n                e.stopPropagation();\n                onManageClick();\n              }}\n            >\n              Add Card\n              <ChevronRight className=\"h-4 w-4 ml-1\" />\n            </Button>\n          </div>\n        ) : defaultMethod?.card ? (\n          <div className=\"space-y-2\">\n            <p className=\"text-xl font-bold\">\n              {getCardBrandIcon(defaultMethod.card.brand)} ****{defaultMethod.card.last4}\n            </p>\n            <p className=\"text-sm text-muted-foreground\">\n              Expires {String(defaultMethod.card.expMonth).padStart(2, \"0\")}/{defaultMethod.card.expYear}\n            </p>\n            {paymentMethods.length > 1 && (\n              <p className=\"text-xs text-muted-foreground\">+{paymentMethods.length - 1} more card(s)</p>\n            )}\n          </div>\n        ) : (\n          <div className=\"space-y-2\">\n            <p className=\"text-xl font-bold\">{defaultMethod?.type || \"Payment Method\"}</p>\n            {paymentMethods.length > 1 && (\n              <p className=\"text-xs text-muted-foreground\">+{paymentMethods.length - 1} more method(s)</p>\n            )}\n          </div>\n        )}\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { ExternalLink, User } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Button, Card, CardContent, CardHeader, CardTitle, Skeleton } from \"../../../../shadcnui\";\nimport { StripeCustomerInterface, StripeCustomerService } from \"../../stripe-customer\";\n\ntype CustomerInfoCardProps = {\n  customer: StripeCustomerInterface | null;\n  loading?: boolean;\n  error?: string;\n};\n\nfunction formatBalance(balance: number | undefined, currency: string | undefined): string {\n  if (balance === undefined || balance === 0) return \"$0.00\";\n  const currencyCode = currency?.toUpperCase() || \"USD\";\n  // Balance in Stripe is negative when customer has credit\n  const displayBalance = -balance;\n  return new Intl.NumberFormat(undefined, {\n    style: \"currency\",\n    currency: currencyCode,\n  }).format(displayBalance / 100);\n}\n\nexport function CustomerInfoCard({ customer, loading, error }: CustomerInfoCardProps) {\n  const [portalLoading, setPortalLoading] = useState(false);\n\n  const handlePortalClick = async (e: React.MouseEvent) => {\n    e.stopPropagation();\n    setPortalLoading(true);\n    try {\n      const { url } = await StripeCustomerService.createPortalSession();\n      window.open(url, \"_blank\");\n    } catch (err) {\n      console.error(\"[CustomerInfoCard] Failed to create portal session:\", err);\n    } finally {\n      setPortalLoading(false);\n    }\n  };\n\n  if (loading) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Billing Account</CardTitle>\n          <User className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <Skeleton className=\"h-6 w-32 mb-2\" />\n          <Skeleton className=\"h-4 w-48 mb-1\" />\n          <Skeleton className=\"h-4 w-24\" />\n        </CardContent>\n      </Card>\n    );\n  }\n\n  if (error) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Billing Account</CardTitle>\n          <User className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <p className=\"text-destructive text-xs/relaxed\">{error}</p>\n        </CardContent>\n      </Card>\n    );\n  }\n\n  if (!customer) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Billing Account</CardTitle>\n          <User className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <p className=\"text-xl font-bold text-muted-foreground\">Not set up</p>\n          <p className=\"text-xs text-muted-foreground\">Billing account will be created when you subscribe</p>\n        </CardContent>\n      </Card>\n    );\n  }\n\n  return (\n    <Card>\n      <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n        <CardTitle>Billing Account</CardTitle>\n        <User className=\"h-4 w-4 text-muted-foreground\" />\n      </CardHeader>\n      <CardContent>\n        <div className=\"space-y-2\">\n          {customer.name && <p className=\"text-xl font-bold\">{customer.name}</p>}\n          {customer.email && <p className=\"text-sm text-muted-foreground\">{customer.email}</p>}\n          {customer.balance !== undefined && customer.balance !== 0 && (\n            <p className=\"text-sm\">\n              <span className=\"text-muted-foreground\">Credit Balance: </span>\n              <span className={customer.balance < 0 ? \"text-success\" : \"text-destructive\"}>\n                {formatBalance(customer.balance, customer.currency)}\n              </span>\n            </p>\n          )}\n          <Button variant=\"outline\" size=\"sm\" className=\"mt-2\" onClick={handlePortalClick} disabled={portalLoading}>\n            {portalLoading ? \"Loading...\" : \"Manage in Stripe Portal\"}\n            <ExternalLink className=\"h-4 w-4 ml-1\" />\n          </Button>\n        </div>\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { ChevronRight, ReceiptIcon } from \"lucide-react\";\nimport { Badge, Card, CardContent, CardHeader, CardTitle, Skeleton } from \"../../../../shadcnui\";\nimport { InvoiceStatus, StripeInvoiceInterface } from \"../../stripe-invoice\";\n\ntype InvoicesSummaryCardProps = {\n  invoices: StripeInvoiceInterface[];\n  loading?: boolean;\n  error?: string;\n  onViewAllClick: () => void;\n};\n\nfunction getStatusBadgeVariant(status: InvoiceStatus): \"default\" | \"secondary\" | \"destructive\" | \"outline\" {\n  switch (status) {\n    case InvoiceStatus.PAID:\n      return \"default\";\n    case InvoiceStatus.OPEN:\n      return \"secondary\";\n    case InvoiceStatus.UNCOLLECTIBLE:\n    case InvoiceStatus.VOID:\n      return \"destructive\";\n    default:\n      return \"outline\";\n  }\n}\n\nfunction formatDate(date: Date): string {\n  return new Date(date).toLocaleDateString(undefined, {\n    year: \"numeric\",\n    month: \"short\",\n    day: \"numeric\",\n  });\n}\n\nfunction formatAmount(amount: number, currency: string): string {\n  const currencyCode = currency?.toUpperCase() || \"USD\";\n  return new Intl.NumberFormat(undefined, {\n    style: \"currency\",\n    currency: currencyCode,\n  }).format(amount / 100);\n}\n\nexport function InvoicesSummaryCard({ invoices, loading, error, onViewAllClick }: InvoicesSummaryCardProps) {\n  if (loading) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Recent Invoices</CardTitle>\n          <ReceiptIcon className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <Skeleton className=\"h-6 w-24 mb-2\" />\n          <Skeleton className=\"h-4 w-32 mb-1\" />\n          <Skeleton className=\"h-4 w-20\" />\n        </CardContent>\n      </Card>\n    );\n  }\n\n  if (error) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Recent Invoices</CardTitle>\n          <ReceiptIcon className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <p className=\"text-destructive text-xs/relaxed\">{error}</p>\n        </CardContent>\n      </Card>\n    );\n  }\n\n  // Get the most recent invoice\n  const latestInvoice = invoices[0];\n  const paidInvoices = invoices.filter((inv) => inv.status === InvoiceStatus.PAID);\n  const openInvoices = invoices.filter((inv) => inv.status === InvoiceStatus.OPEN);\n\n  return (\n    <Card className=\"cursor-pointer hover:bg-accent/50 transition-colors\" onClick={onViewAllClick}>\n      <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n        <CardTitle>Recent Invoices</CardTitle>\n        <ReceiptIcon className=\"h-4 w-4 text-muted-foreground\" />\n      </CardHeader>\n      <CardContent>\n        {invoices.length === 0 ? (\n          <div className=\"space-y-2\">\n            <p className=\"text-xl font-bold text-muted-foreground\">No invoices yet</p>\n            <p className=\"text-xs text-muted-foreground\">Invoices will appear after your first billing cycle</p>\n          </div>\n        ) : latestInvoice ? (\n          <div className=\"space-y-2\">\n            <div className=\"flex items-center gap-2\">\n              <p className=\"text-xl font-bold\">{formatAmount(latestInvoice.total, latestInvoice.currency)}</p>\n              <Badge variant={getStatusBadgeVariant(latestInvoice.status)}>{latestInvoice.status}</Badge>\n            </div>\n            <p className=\"text-sm text-muted-foreground\">\n              {latestInvoice.stripeInvoiceNumber || `Invoice from ${formatDate(latestInvoice.periodStart)}`}\n            </p>\n            <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n              {paidInvoices.length > 0 && <span>{paidInvoices.length} paid</span>}\n              {openInvoices.length > 0 && <span className=\"text-warning\">{openInvoices.length} open</span>}\n              <span className=\"flex items-center\">\n                View all\n                <ChevronRight className=\"h-3 w-3 ml-1\" />\n              </span>\n            </div>\n          </div>\n        ) : null}\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { Activity, ChevronRight } from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle, Skeleton } from \"../../../../shadcnui\";\nimport { MeterInterface, MeterSummaryInterface } from \"../../stripe-usage\";\n\ntype BillingUsageSummaryCardProps = {\n  meters: MeterInterface[];\n  summaries: Record<string, MeterSummaryInterface | null>;\n  loading?: boolean;\n  error?: string;\n  onViewDetailsClick: () => void;\n};\n\nfunction formatNumber(value: number): string {\n  return new Intl.NumberFormat(undefined, {\n    notation: \"compact\",\n    compactDisplay: \"short\",\n  }).format(value);\n}\n\nexport function BillingUsageSummaryCard({\n  meters,\n  summaries,\n  loading,\n  error,\n  onViewDetailsClick,\n}: BillingUsageSummaryCardProps) {\n  if (loading) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Usage This Month</CardTitle>\n          <Activity className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <Skeleton className=\"h-6 w-24 mb-2\" />\n          <Skeleton className=\"h-4 w-32\" />\n        </CardContent>\n      </Card>\n    );\n  }\n\n  if (error) {\n    return (\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <CardTitle>Usage This Month</CardTitle>\n          <Activity className=\"h-4 w-4 text-muted-foreground\" />\n        </CardHeader>\n        <CardContent>\n          <p className=\"text-destructive text-xs/relaxed\">{error}</p>\n        </CardContent>\n      </Card>\n    );\n  }\n\n  // Calculate total usage across all meters\n  const totalUsage = Object.values(summaries).reduce((acc, summary) => {\n    return acc + (summary?.aggregatedValue || 0);\n  }, 0);\n\n  // Get first meter with data for display\n  const primaryMeter = meters.find((m) => summaries[m.id]?.aggregatedValue);\n  const primarySummary = primaryMeter ? summaries[primaryMeter.id] : null;\n\n  return (\n    <Card className=\"cursor-pointer hover:bg-accent/50 transition-colors\" onClick={onViewDetailsClick}>\n      <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n        <CardTitle>Usage This Month</CardTitle>\n        <Activity className=\"h-4 w-4 text-muted-foreground\" />\n      </CardHeader>\n      <CardContent>\n        {meters.length === 0 ? (\n          <div className=\"space-y-2\">\n            <p className=\"text-xl font-bold text-muted-foreground\">No meters</p>\n            <p className=\"text-xs text-muted-foreground\">No usage meters are configured</p>\n          </div>\n        ) : (\n          <div className=\"space-y-2\">\n            <p className=\"text-xl font-bold\">{formatNumber(totalUsage)} units</p>\n            {primaryMeter && primarySummary && (\n              <p className=\"text-sm text-muted-foreground\">\n                {primaryMeter.displayName}: {formatNumber(primarySummary.aggregatedValue)}\n              </p>\n            )}\n            {meters.length > 1 && <p className=\"text-xs text-muted-foreground\">Across {meters.length} meters</p>}\n            <span className=\"flex items-center text-xs text-muted-foreground\">\n              View details\n              <ChevronRight className=\"h-3 w-3 ml-1\" />\n            </span>\n          </div>\n        )}\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { CreditCard, Loader2, Wallet } from \"lucide-react\";\nimport { useSearchParams } from \"next/navigation\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Button, Card, CardContent, CardDescription, CardHeader, CardTitle } from \"../../../../shadcnui\";\nimport { PaymentMethodInterface, StripeCustomerInterface, StripeCustomerService } from \"../../stripe-customer\";\nimport { PaymentMethodsContainer } from \"../../stripe-customer/components\";\nimport { StripeInvoiceInterface, StripeInvoiceService } from \"../../stripe-invoice\";\nimport { InvoicesContainer } from \"../../stripe-invoice/components\";\nimport { StripeSubscriptionInterface, StripeSubscriptionService, SubscriptionStatus } from \"../../stripe-subscription\";\nimport { SubscriptionsContainer } from \"../../stripe-subscription/components\";\nimport { SubscriptionWizard } from \"../../stripe-subscription/components/wizards\";\nimport { MeterInterface, MeterSummaryInterface, StripeUsageService } from \"../../stripe-usage\";\nimport { UsageContainer } from \"../../stripe-usage/components\";\nimport {\n  BillingUsageSummaryCard,\n  CustomerInfoCard,\n  InvoicesSummaryCard,\n  PaymentMethodSummaryCard,\n  SubscriptionSummaryCard,\n} from \"../cards\";\nimport { BillingDetailModal } from \"../modals/BillingDetailModal\";\nimport { BillingAlertBanner } from \"../widgets/BillingAlertBanner\";\n\ntype ModalType = \"subscriptions\" | \"payment-methods\" | \"invoices\" | \"usage\" | null;\n\ntype DataState = {\n  customer: StripeCustomerInterface | null;\n  subscriptions: StripeSubscriptionInterface[];\n  paymentMethods: PaymentMethodInterface[];\n  invoices: StripeInvoiceInterface[];\n  meters: MeterInterface[];\n  meterSummaries: Record<string, MeterSummaryInterface | null>;\n};\n\ntype LoadingState = {\n  customer: boolean;\n  subscriptions: boolean;\n  paymentMethods: boolean;\n  invoices: boolean;\n  usage: boolean;\n};\n\ntype ErrorState = {\n  customer: string | null;\n  subscriptions: string | null;\n  paymentMethods: string | null;\n  invoices: string | null;\n  usage: string | null;\n};\n\nexport function BillingDashboardContainer() {\n  const [data, setData] = useState<DataState>({\n    customer: null,\n    subscriptions: [],\n    paymentMethods: [],\n    invoices: [],\n    meters: [],\n    meterSummaries: {},\n  });\n\n  const [loading, setLoading] = useState<LoadingState>({\n    customer: true,\n    subscriptions: true,\n    paymentMethods: true,\n    invoices: true,\n    usage: true,\n  });\n\n  const [errors, setErrors] = useState<ErrorState>({\n    customer: null,\n    subscriptions: null,\n    paymentMethods: null,\n    invoices: null,\n    usage: null,\n  });\n\n  const [activeModal, setActiveModal] = useState<ModalType>(null);\n  const [noCustomerExists, setNoCustomerExists] = useState(false);\n  const [creatingCustomer, setCreatingCustomer] = useState(false);\n  const searchParams = useSearchParams();\n\n  // Wizard state - lifted from SubscriptionsContainer to avoid nested dialogs\n  const [showWizard, setShowWizard] = useState(false);\n  const [editingSubscription, setEditingSubscription] = useState<StripeSubscriptionInterface | null>(null);\n\n  // Check if company has metered subscriptions\n  const hasMeteredSubscriptions = useCallback((): boolean => {\n    return data.subscriptions.some((sub) => sub.price?.recurring?.usageType === \"metered\");\n  }, [data.subscriptions]);\n\n  // Check if user has active recurring subscription (for wizard filtering)\n  const hasActiveRecurringSubscription = useMemo(() => {\n    return data.subscriptions.some(\n      (sub) =>\n        (sub.status === SubscriptionStatus.ACTIVE || sub.status === SubscriptionStatus.TRIALING) &&\n        sub.price?.priceType === \"recurring\",\n    );\n  }, [data.subscriptions]);\n\n  // Fetch all data - first check customer, then fetch rest if customer exists\n  const fetchAllData = useCallback(async () => {\n    setNoCustomerExists(false);\n\n    // First, try to fetch customer\n    let customer: StripeCustomerInterface | null = null;\n    try {\n      customer = await StripeCustomerService.getCustomer();\n      setData((prev) => ({ ...prev, customer }));\n      setErrors((prev) => ({ ...prev, customer: null }));\n      setNoCustomerExists(false);\n    } catch (error: unknown) {\n      console.error(\"[BillingDashboard] Failed to load customer:\", error);\n      // A 404 means the company has no billing customer yet - a setup prompt, not an error.\n      // Match on the status, never on the message: `statusText` is empty over HTTP/2, so the\n      // error text carries no reason phrase to match against.\n      if ((error as { status?: number })?.status === 404) {\n        setNoCustomerExists(true);\n      } else {\n        setErrors((prev) => ({ ...prev, customer: \"Failed to load billing account\" }));\n      }\n    } finally {\n      setLoading((prev) => ({ ...prev, customer: false }));\n    }\n\n    // Without a customer there is nothing downstream to fetch. Release every section here, or the\n    // cards that are only cleared inside their own fetchers stay skeletons forever.\n    if (!customer) {\n      setLoading({\n        customer: false,\n        subscriptions: false,\n        paymentMethods: false,\n        invoices: false,\n        usage: false,\n      });\n      return;\n    }\n\n    // Fetch subscriptions\n    const fetchSubscriptions = async () => {\n      try {\n        const subscriptions = await StripeSubscriptionService.listSubscriptions();\n        setData((prev) => ({ ...prev, subscriptions }));\n        setErrors((prev) => ({ ...prev, subscriptions: null }));\n        return subscriptions;\n      } catch (error) {\n        console.error(\"[BillingDashboard] Failed to load subscriptions:\", error);\n        setErrors((prev) => ({ ...prev, subscriptions: \"Failed to load subscriptions\" }));\n        return [];\n      } finally {\n        setLoading((prev) => ({ ...prev, subscriptions: false }));\n      }\n    };\n\n    // Fetch payment methods\n    const fetchPaymentMethods = async () => {\n      try {\n        const paymentMethods = await StripeCustomerService.listPaymentMethods();\n        setData((prev) => ({ ...prev, paymentMethods }));\n        setErrors((prev) => ({ ...prev, paymentMethods: null }));\n      } catch (error) {\n        console.error(\"[BillingDashboard] Failed to load payment methods:\", error);\n        setErrors((prev) => ({ ...prev, paymentMethods: \"Failed to load payment methods\" }));\n      } finally {\n        setLoading((prev) => ({ ...prev, paymentMethods: false }));\n      }\n    };\n\n    // Fetch invoices\n    const fetchInvoices = async () => {\n      try {\n        const invoices = await StripeInvoiceService.listInvoices();\n        setData((prev) => ({ ...prev, invoices }));\n        setErrors((prev) => ({ ...prev, invoices: null }));\n      } catch (error) {\n        console.error(\"[BillingDashboard] Failed to load invoices:\", error);\n        setErrors((prev) => ({ ...prev, invoices: \"Failed to load invoices\" }));\n      } finally {\n        setLoading((prev) => ({ ...prev, invoices: false }));\n      }\n    };\n\n    // Execute all in parallel\n    const [subscriptions] = await Promise.all([fetchSubscriptions(), fetchPaymentMethods(), fetchInvoices()]);\n\n    // Check if there are metered subscriptions and fetch usage data\n    const hasMetered = subscriptions.some(\n      (sub: StripeSubscriptionInterface) => sub.price?.recurring?.usageType === \"metered\",\n    );\n\n    if (hasMetered) {\n      await fetchUsageData();\n    } else {\n      setLoading((prev) => ({ ...prev, usage: false }));\n    }\n  }, []);\n\n  // Create a new Stripe customer for the company\n  const handleCreateCustomer = async () => {\n    setCreatingCustomer(true);\n    try {\n      await StripeCustomerService.createCustomer();\n      setNoCustomerExists(false);\n      // Refresh all data after customer creation\n      await fetchAllData();\n    } catch (error) {\n      console.error(\"[BillingDashboard] Failed to create customer:\", error);\n      setErrors((prev) => ({ ...prev, customer: \"Failed to set up billing\" }));\n    } finally {\n      setCreatingCustomer(false);\n    }\n  };\n\n  // Fetch usage data (called conditionally)\n  const fetchUsageData = async () => {\n    try {\n      const meters = await StripeUsageService.listMeters();\n      setData((prev) => ({ ...prev, meters }));\n\n      // Load summaries for each meter (current month)\n      const summariesMap: Record<string, MeterSummaryInterface | null> = {};\n      const now = new Date();\n      const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n      const endOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59, 999);\n\n      for (const meter of meters) {\n        try {\n          const meterSummaries = await StripeUsageService.getMeterSummaries({\n            meterId: meter.id,\n            startTime: startOfMonth,\n            endTime: endOfMonth,\n          });\n          summariesMap[meter.id] = meterSummaries.length > 0 ? meterSummaries[0] : null;\n        } catch (error) {\n          console.error(`[BillingDashboard] Failed to load summaries for meter ${meter.id}:`, error);\n          summariesMap[meter.id] = null;\n        }\n      }\n\n      setData((prev) => ({ ...prev, meterSummaries: summariesMap }));\n      setErrors((prev) => ({ ...prev, usage: null }));\n    } catch (error) {\n      console.error(\"[BillingDashboard] Failed to load usage data:\", error);\n      setErrors((prev) => ({ ...prev, usage: \"Failed to load usage data\" }));\n    } finally {\n      setLoading((prev) => ({ ...prev, usage: false }));\n    }\n  };\n\n  // Refresh data after modal actions\n  const refreshData = useCallback(async () => {\n    // Reset loading states for a refresh\n    setLoading({\n      customer: true,\n      subscriptions: true,\n      paymentMethods: true,\n      invoices: true,\n      usage: true,\n    });\n    await fetchAllData();\n  }, [fetchAllData]);\n\n  // Handler to open wizard (can be called from SubscriptionsContainer)\n  const handleOpenWizard = useCallback((subscription?: StripeSubscriptionInterface) => {\n    setEditingSubscription(subscription || null);\n    setShowWizard(true);\n  }, []);\n\n  // Handler to close wizard\n  const handleWizardClose = useCallback(() => {\n    setShowWizard(false);\n    setEditingSubscription(null);\n    refreshData();\n  }, [refreshData]);\n\n  // Initial data load\n  useEffect(() => {\n    fetchAllData();\n  }, [fetchAllData]);\n\n  // Handle URL action parameter for deep linking\n  useEffect(() => {\n    const action = searchParams.get(\"action\");\n    if (action === \"subscribe\") {\n      // Open wizard directly (no wrapper modal)\n      setShowWizard(true);\n      // Clear the URL param to prevent re-triggering on refresh\n      window.history.replaceState({}, \"\", window.location.pathname);\n    }\n  }, [searchParams]);\n\n  // Detect critical subscriptions for alert banners\n  const criticalSubscriptions = data.subscriptions.filter(\n    (sub) =>\n      sub.status === SubscriptionStatus.PAST_DUE ||\n      (sub.status === SubscriptionStatus.TRIALING &&\n        sub.trialEnd &&\n        new Date(sub.trialEnd).getTime() - new Date().getTime() <= 7 * 24 * 60 * 60 * 1000),\n  );\n\n  // Handle modal close with refresh\n  const handleModalClose = (open: boolean) => {\n    if (!open) {\n      setActiveModal(null);\n      refreshData();\n    }\n  };\n\n  // Get modal title based on type\n  const getModalTitle = (type: ModalType): string => {\n    switch (type) {\n      case \"subscriptions\":\n        return \"Manage Subscriptions\";\n      case \"payment-methods\":\n        return \"Payment Methods\";\n      case \"invoices\":\n        return \"Invoice History\";\n      case \"usage\":\n        return \"Usage Tracking\";\n      default:\n        return \"\";\n    }\n  };\n\n  // Show loading state while checking for customer\n  const isInitialLoading = loading.customer && !noCustomerExists && !data.customer;\n\n  return (\n    <div className=\"flex w-full flex-col gap-y-6\">\n      {/* Header */}\n      <div className=\"flex items-center gap-x-3\">\n        <Wallet className=\"h-8 w-8\" />\n        <h1 className=\"text-primary text-3xl font-semibold\">Billing</h1>\n      </div>\n\n      {/* Initial Loading State */}\n      {isInitialLoading && (\n        <Card>\n          <CardContent className=\"flex items-center justify-center py-12\">\n            <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n          </CardContent>\n        </Card>\n      )}\n\n      {/* No Customer State - Show Setup Prompt */}\n      {noCustomerExists && !isInitialLoading && (\n        <Card>\n          <CardHeader className=\"text-center\">\n            <div className=\"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-primary/10\">\n              <CreditCard className=\"h-8 w-8 text-primary\" />\n            </div>\n            <CardTitle>Set Up Billing</CardTitle>\n            <CardDescription>\n              Your company doesn&apos;t have a billing account yet. Set one up to manage subscriptions, payment methods,\n              and view invoices.\n            </CardDescription>\n          </CardHeader>\n          <CardContent className=\"flex justify-center pb-8\">\n            <Button onClick={handleCreateCustomer} disabled={creatingCustomer} size=\"lg\">\n              {creatingCustomer ? (\n                <>\n                  <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n                  Setting up...\n                </>\n              ) : (\n                \"Set Up Billing Account\"\n              )}\n            </Button>\n          </CardContent>\n          {errors.customer && (\n            <CardContent className=\"pt-0\">\n              <p className=\"text-center text-destructive text-xs/relaxed\">{errors.customer}</p>\n            </CardContent>\n          )}\n        </Card>\n      )}\n\n      {/* Main Dashboard Content - Only shown when customer exists */}\n      {!noCustomerExists && !isInitialLoading && (\n        <>\n          {/* Alert Banners */}\n          {criticalSubscriptions.map((subscription) => (\n            <BillingAlertBanner\n              key={subscription.id}\n              subscription={subscription}\n              onUpdatePayment={() => setActiveModal(\"payment-methods\")}\n              onAddPayment={() => setActiveModal(\"payment-methods\")}\n            />\n          ))}\n\n          {/* Summary Cards Grid */}\n          <div className=\"grid gap-4 md:grid-cols-2\">\n            <SubscriptionSummaryCard\n              subscriptions={data.subscriptions}\n              loading={loading.subscriptions}\n              error={errors.subscriptions || undefined}\n              onManageClick={() => {\n                if (data.subscriptions.length === 0) {\n                  // No subscriptions - open wizard directly\n                  setShowWizard(true);\n                } else {\n                  // Has subscriptions - open manage modal\n                  setActiveModal(\"subscriptions\");\n                }\n              }}\n            />\n\n            <PaymentMethodSummaryCard\n              paymentMethods={data.paymentMethods}\n              defaultPaymentMethodId={data.customer?.defaultPaymentMethodId}\n              loading={loading.paymentMethods}\n              error={errors.paymentMethods || undefined}\n              onManageClick={() => setActiveModal(\"payment-methods\")}\n            />\n\n            <CustomerInfoCard\n              customer={data.customer}\n              loading={loading.customer}\n              error={errors.customer || undefined}\n            />\n\n            <InvoicesSummaryCard\n              invoices={data.invoices}\n              loading={loading.invoices}\n              error={errors.invoices || undefined}\n              onViewAllClick={() => setActiveModal(\"invoices\")}\n            />\n\n            {/* Usage Card - only shown when metered subscriptions exist */}\n            {hasMeteredSubscriptions() && (\n              <BillingUsageSummaryCard\n                meters={data.meters}\n                summaries={data.meterSummaries}\n                loading={loading.usage}\n                error={errors.usage || undefined}\n                onViewDetailsClick={() => setActiveModal(\"usage\")}\n              />\n            )}\n          </div>\n\n          {/* Detail Modals */}\n          <BillingDetailModal\n            open={activeModal === \"subscriptions\"}\n            onOpenChange={handleModalClose}\n            title={getModalTitle(\"subscriptions\")}\n          >\n            <SubscriptionsContainer\n              onOpenWizard={handleOpenWizard}\n              hasActiveRecurringSubscription={hasActiveRecurringSubscription}\n            />\n          </BillingDetailModal>\n\n          <BillingDetailModal\n            open={activeModal === \"payment-methods\"}\n            onOpenChange={handleModalClose}\n            title={getModalTitle(\"payment-methods\")}\n          >\n            <PaymentMethodsContainer />\n          </BillingDetailModal>\n\n          <BillingDetailModal\n            open={activeModal === \"invoices\"}\n            onOpenChange={handleModalClose}\n            title={getModalTitle(\"invoices\")}\n          >\n            <InvoicesContainer />\n          </BillingDetailModal>\n\n          <BillingDetailModal\n            open={activeModal === \"usage\"}\n            onOpenChange={handleModalClose}\n            title={getModalTitle(\"usage\")}\n          >\n            <UsageContainer />\n          </BillingDetailModal>\n\n          {/* Subscription Wizard - rendered at dashboard level to avoid nested dialogs */}\n          <SubscriptionWizard\n            open={showWizard}\n            onOpenChange={(open) => !open && handleWizardClose()}\n            onSuccess={refreshData}\n            hasActiveRecurringSubscription={hasActiveRecurringSubscription}\n            subscription={editingSubscription ?? undefined}\n          />\n        </>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { CreditCard } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { Button } from \"../../../../../shadcnui\";\nimport { PaymentMethodInterface, StripeCustomerService } from \"../../data\";\nimport { PaymentMethodEditor } from \"../forms/PaymentMethodEditor\";\nimport { PaymentMethodsList } from \"../lists/PaymentMethodsList\";\n\nexport function PaymentMethodsContainer() {\n  const [paymentMethods, setPaymentMethods] = useState<PaymentMethodInterface[]>([]);\n  const [loading, setLoading] = useState<boolean>(true);\n  const [showAddPaymentMethod, setShowAddPaymentMethod] = useState<boolean>(false);\n\n  const loadPaymentMethods = async () => {\n    setLoading(true);\n    try {\n      const fetchedPaymentMethods = await StripeCustomerService.listPaymentMethods();\n      setPaymentMethods(fetchedPaymentMethods);\n    } catch (error) {\n      console.error(\"[PaymentMethodsContainer] Failed to load payment methods:\", error);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  useEffect(() => {\n    loadPaymentMethods();\n  }, []);\n\n  if (loading) {\n    return (\n      <div className=\"flex h-64 items-center justify-center\">\n        <p className=\"text-muted-foreground\">Loading payment methods...</p>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"flex w-full flex-col gap-y-6\">\n      {/* Header */}\n      <div className=\"flex items-center justify-between\">\n        <div className=\"flex items-center gap-x-3\">\n          <CreditCard className=\"h-8 w-8\" />\n          <h1 className=\"text-primary text-3xl font-semibold\">Payment Methods</h1>\n        </div>\n        <Button onClick={() => setShowAddPaymentMethod(true)}>Add Payment Method</Button>\n      </div>\n\n      {/* Empty State */}\n      {paymentMethods.length === 0 && (\n        <div className=\"flex flex-col items-center justify-center gap-y-4 rounded-lg border-2 border-dashed border-gray-300 bg-muted/50 p-12\">\n          <CreditCard className=\"h-16 w-16 text-muted-foreground\" />\n          <div className=\"text-center\">\n            <h3 className=\"mb-2 text-sm font-medium\">No payment methods</h3>\n            <p className=\"mb-4 text-muted-foreground\">\n              Add a payment method to enable subscriptions and secure checkout.\n            </p>\n            <Button onClick={() => setShowAddPaymentMethod(true)}>Add Your First Card</Button>\n          </div>\n        </div>\n      )}\n\n      {/* Payment Methods List */}\n      {paymentMethods.length > 0 && (\n        <PaymentMethodsList paymentMethods={paymentMethods} onUpdate={loadPaymentMethods} />\n      )}\n\n      {/* Add Payment Method Modal */}\n      {showAddPaymentMethod && (\n        <PaymentMethodEditor\n          open={showAddPaymentMethod}\n          onOpenChange={setShowAddPaymentMethod}\n          onSuccess={loadPaymentMethods}\n        />\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { CardElement, useElements, useStripe } from \"@stripe/react-stripe-js\";\nimport { useEffect, useState } from \"react\";\nimport { Alert, AlertDescription, Button, Checkbox, Label } from \"../../../../../shadcnui\";\nimport { StripeCustomerService } from \"../../data\";\n\ntype PaymentMethodFormProps = {\n  onSuccess: () => void;\n  onCancel: () => void;\n  isLoading?: boolean;\n};\n\nexport function PaymentMethodForm({ onSuccess, onCancel, isLoading = false }: PaymentMethodFormProps) {\n  const stripe = useStripe();\n  const elements = useElements();\n\n  const [setupIntent, setSetupIntent] = useState<{ clientSecret: string } | null>(null);\n  const [loading, setLoading] = useState<boolean>(true);\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n  const [error, setError] = useState<string | null>(null);\n  const [setAsDefault, setSetAsDefault] = useState<boolean>(true);\n\n  // Fetch setup intent on component mount\n  useEffect(() => {\n    const fetchSetupIntent = async () => {\n      setLoading(true);\n      try {\n        const intent = await StripeCustomerService.createSetupIntent();\n        setSetupIntent(intent);\n      } catch (err) {\n        console.error(\"[PaymentMethodForm] Failed to create setup intent:\", err);\n        setError(\"Failed to initialize payment form. Please try again.\");\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchSetupIntent();\n  }, []);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n\n    if (!stripe || !elements || !setupIntent) {\n      return;\n    }\n\n    setIsSubmitting(true);\n    setError(null);\n\n    try {\n      const cardElement = elements.getElement(CardElement);\n      if (!cardElement) {\n        throw new Error(\"Card element not found\");\n      }\n\n      // Confirm card setup with Stripe\n      const { error: stripeError, setupIntent: confirmedSetupIntent } = await stripe.confirmCardSetup(\n        setupIntent.clientSecret,\n        {\n          payment_method: {\n            card: cardElement,\n          },\n        },\n      );\n\n      if (stripeError) {\n        console.error(\"[PaymentMethodForm] Stripe error:\", stripeError);\n        setError(stripeError.message || \"Failed to add payment method. Please check your card details.\");\n        setIsSubmitting(false);\n        return;\n      }\n\n      // Set as default if checkbox is checked\n      if (setAsDefault && confirmedSetupIntent?.payment_method) {\n        await StripeCustomerService.setDefaultPaymentMethod({\n          paymentMethodId:\n            typeof confirmedSetupIntent.payment_method === \"string\"\n              ? confirmedSetupIntent.payment_method\n              : confirmedSetupIntent.payment_method.id,\n        });\n      }\n\n      onSuccess();\n    } catch (err: any) {\n      console.error(\"[PaymentMethodForm] Error:\", err);\n      setError(err.message || \"An unexpected error occurred. Please try again.\");\n    } finally {\n      setIsSubmitting(false);\n    }\n  };\n\n  if (loading) {\n    return (\n      <div className=\"flex items-center justify-center py-8\">\n        <p className=\"text-muted-foreground\">Loading payment form...</p>\n      </div>\n    );\n  }\n\n  if (!setupIntent && error) {\n    return (\n      <Alert variant=\"destructive\" className=\"bg-red-50 border-red-200\">\n        <AlertDescription>{error}</AlertDescription>\n      </Alert>\n    );\n  }\n\n  return (\n    <form onSubmit={handleSubmit} className=\"flex flex-col gap-y-4\">\n      {/* Card Element */}\n      <div className=\"rounded-md border border-gray-300 p-3\">\n        <CardElement\n          options={{\n            style: {\n              base: {\n                fontSize: \"16px\",\n                color: \"#424770\",\n                \"::placeholder\": {\n                  color: \"#aab7c4\",\n                },\n              },\n              invalid: {\n                color: \"#9e2146\",\n              },\n            },\n          }}\n        />\n      </div>\n\n      {/* Set as Default Checkbox */}\n      <div className=\"flex items-center gap-x-2\">\n        <Checkbox id=\"setAsDefault\" checked={setAsDefault} onCheckedChange={(checked) => setSetAsDefault(!!checked)} />\n        <Label htmlFor=\"setAsDefault\" className=\"cursor-pointer font-normal\">\n          Set as default payment method\n        </Label>\n      </div>\n\n      {/* Error Alert */}\n      {error && (\n        <Alert variant=\"destructive\" className=\"bg-red-50 border-red-200\">\n          <AlertDescription>{error}</AlertDescription>\n        </Alert>\n      )}\n\n      {/* Action Buttons */}\n      <div className=\"flex justify-end gap-x-2\">\n        <Button type=\"button\" variant=\"outline\" onClick={onCancel} disabled={isSubmitting || isLoading}>\n          Cancel\n        </Button>\n        <Button type=\"submit\" disabled={!stripe || isSubmitting || isLoading}>\n          {isSubmitting ? \"Processing...\" : \"Add Card\"}\n        </Button>\n      </div>\n    </form>\n  );\n}\n","\"use client\";\n\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../../../../../shadcnui\";\nimport { PaymentMethodForm } from \"./PaymentMethodForm\";\n\ntype PaymentMethodEditorProps = {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onSuccess: () => void;\n};\n\nexport function PaymentMethodEditor({ open, onOpenChange, onSuccess }: PaymentMethodEditorProps) {\n  const handleSuccess = () => {\n    onSuccess();\n    onOpenChange(false);\n  };\n\n  const handleCancel = () => {\n    onOpenChange(false);\n  };\n\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className=\"max-w-md\">\n        <DialogHeader>\n          <DialogTitle>Add Payment Method</DialogTitle>\n          <DialogDescription>\n            Add a new payment method to your account. Your card information is securely processed by Stripe.\n          </DialogDescription>\n        </DialogHeader>\n        {open && <PaymentMethodForm onSuccess={handleSuccess} onCancel={handleCancel} />}\n      </DialogContent>\n    </Dialog>\n  );\n}\n","\"use client\";\n\nimport { MoreVertical } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n  Badge,\n  Button,\n  Card,\n  CardContent,\n  CardHeader,\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuTrigger,\n} from \"../../../../../shadcnui\";\nimport { PaymentMethodInterface, StripeCustomerInterface, StripeCustomerService } from \"../../data\";\n\ntype PaymentMethodCardProps = {\n  paymentMethod: PaymentMethodInterface;\n  onUpdate: () => void;\n};\n\n// Card brand icons mapping\nconst brandIcons: Record<string, string> = {\n  visa: \"💳\",\n  mastercard: \"💳\",\n  amex: \"💳\",\n  discover: \"💳\",\n};\n\nexport function PaymentMethodCard({ paymentMethod, onUpdate }: PaymentMethodCardProps) {\n  const [loading, setLoading] = useState<boolean>(false);\n  const [customer, setCustomer] = useState<StripeCustomerInterface | null>(null);\n  const [showRemoveDialog, setShowRemoveDialog] = useState<boolean>(false);\n\n  // Load customer to check default payment method\n  useEffect(() => {\n    const loadCustomer = async () => {\n      try {\n        const fetchedCustomer = await StripeCustomerService.getCustomer();\n        setCustomer(fetchedCustomer);\n      } catch (error) {\n        console.error(\"[PaymentMethodCard] Failed to load customer:\", error);\n      }\n    };\n\n    loadCustomer();\n  }, []);\n\n  const isDefault = customer?.defaultPaymentMethodId === paymentMethod.id;\n  const brand = paymentMethod.card?.brand || \"card\";\n  const last4 = paymentMethod.card?.last4 || \"****\";\n  const expMonth = paymentMethod.card?.expMonth || 0;\n  const expYear = paymentMethod.card?.expYear || 0;\n  const brandIcon = brandIcons[brand.toLowerCase()] || \"💳\";\n\n  const handleSetDefault = async () => {\n    setLoading(true);\n    try {\n      await StripeCustomerService.setDefaultPaymentMethod({ paymentMethodId: paymentMethod.id });\n      onUpdate();\n    } catch (error) {\n      console.error(\"[PaymentMethodCard] Failed to set as default:\", error);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handleRemove = async () => {\n    setLoading(true);\n    try {\n      await StripeCustomerService.removePaymentMethod({ paymentMethodId: paymentMethod.id });\n      setShowRemoveDialog(false);\n      onUpdate();\n    } catch (error) {\n      console.error(\"[PaymentMethodCard] Failed to remove:\", error);\n      setLoading(false);\n    }\n  };\n\n  return (\n    <>\n      <Card className=\"relative\">\n        {/* Default Badge */}\n        {isDefault && (\n          <Badge variant=\"softGreen\" className=\"absolute right-2 top-2\">\n            Default\n          </Badge>\n        )}\n\n        <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n          <div className=\"flex items-center gap-x-2\">\n            <span className=\"text-2xl\">{brandIcon}</span>\n            <span className=\"text-sm font-medium capitalize\">{brand}</span>\n          </div>\n          <DropdownMenu>\n            <DropdownMenuTrigger>\n              <Button\n                render={<div />}\n                nativeButton={false}\n                variant=\"ghost\"\n                size=\"sm\"\n                disabled={loading}\n                className=\"h-8 w-8 p-0\"\n              >\n                <MoreVertical className=\"h-4 w-4\" />\n              </Button>\n            </DropdownMenuTrigger>\n            <DropdownMenuContent align=\"end\">\n              {!isDefault && (\n                <DropdownMenuItem onClick={handleSetDefault} disabled={loading}>\n                  Set as Default\n                </DropdownMenuItem>\n              )}\n              <DropdownMenuItem\n                onClick={() => setShowRemoveDialog(true)}\n                disabled={loading}\n                className=\"text-destructive\"\n              >\n                Remove\n              </DropdownMenuItem>\n            </DropdownMenuContent>\n          </DropdownMenu>\n        </CardHeader>\n\n        <CardContent>\n          <div className=\"flex flex-col gap-y-1\">\n            <p className=\"text-lg font-semibold\">•••• {last4}</p>\n            <p className=\"text-sm text-muted-foreground\">\n              Expires {String(expMonth).padStart(2, \"0\")}/{expYear}\n            </p>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Remove Confirmation Dialog */}\n      <AlertDialog open={showRemoveDialog} onOpenChange={setShowRemoveDialog}>\n        <AlertDialogContent>\n          <AlertDialogHeader>\n            <AlertDialogTitle>Remove Payment Method</AlertDialogTitle>\n            <AlertDialogDescription>\n              Are you sure you want to remove this payment method? This action cannot be undone.\n              {isDefault && \" This is your default payment method.\"}\n            </AlertDialogDescription>\n          </AlertDialogHeader>\n          <AlertDialogFooter>\n            <AlertDialogCancel disabled={loading}>Cancel</AlertDialogCancel>\n            <AlertDialogAction onClick={handleRemove} disabled={loading} className=\"bg-red-600 hover:bg-red-700\">\n              {loading ? \"Removing...\" : \"Remove\"}\n            </AlertDialogAction>\n          </AlertDialogFooter>\n        </AlertDialogContent>\n      </AlertDialog>\n    </>\n  );\n}\n","\"use client\";\n\nimport { PaymentMethodInterface } from \"../../data\";\nimport { PaymentMethodCard } from \"../details/PaymentMethodCard\";\n\ntype PaymentMethodsListProps = {\n  paymentMethods: PaymentMethodInterface[];\n  onUpdate: () => void;\n};\n\nexport function PaymentMethodsList({ paymentMethods, onUpdate }: PaymentMethodsListProps) {\n  return (\n    <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3\">\n      {paymentMethods.map((paymentMethod) => (\n        <PaymentMethodCard key={paymentMethod.id} paymentMethod={paymentMethod} onUpdate={onUpdate} />\n      ))}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { Tabs, TabsList, TabsTrigger } from \"../../../../../shadcnui\";\nimport { InvoiceStatus, StripeInvoiceInterface } from \"../../data/stripe-invoice.interface\";\nimport { StripeInvoiceService } from \"../../data/stripe-invoice.service\";\nimport { InvoicesList } from \"../lists/InvoicesList\";\n\ntype StatusFilter = InvoiceStatus | \"all\";\n\nexport function InvoicesContainer() {\n  const [invoices, setInvoices] = useState<StripeInvoiceInterface[]>([]);\n  const [loading, setLoading] = useState<boolean>(true);\n  const [statusFilter, setStatusFilter] = useState<StatusFilter>(\"all\");\n\n  const loadInvoices = async () => {\n    setLoading(true);\n    try {\n      const params = statusFilter !== \"all\" ? { status: statusFilter } : undefined;\n      const data = await StripeInvoiceService.listInvoices(params);\n      setInvoices(data);\n    } catch (error) {\n      console.error(\"[InvoicesContainer] Failed to load invoices:\", error);\n      setInvoices([]);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  useEffect(() => {\n    loadInvoices();\n  }, [statusFilter]);\n\n  const handleFilterChange = (value: string) => {\n    setStatusFilter(value as StatusFilter);\n  };\n\n  return (\n    <div className=\"space-y-4\">\n      {/* Status Filter Tabs */}\n      <Tabs value={statusFilter} onValueChange={handleFilterChange}>\n        <TabsList>\n          <TabsTrigger value=\"all\">All</TabsTrigger>\n          <TabsTrigger value={InvoiceStatus.PAID}>Paid</TabsTrigger>\n          <TabsTrigger value={InvoiceStatus.OPEN}>Open</TabsTrigger>\n          <TabsTrigger value={InvoiceStatus.VOID}>Void</TabsTrigger>\n          <TabsTrigger value={InvoiceStatus.UNCOLLECTIBLE}>Uncollectible</TabsTrigger>\n        </TabsList>\n      </Tabs>\n\n      {/* Loading State */}\n      {loading && <div className=\"text-center py-8 text-muted-foreground\">Loading invoices...</div>}\n\n      {/* Empty State */}\n      {!loading && invoices.length === 0 && (\n        <div className=\"border border-dashed border-gray-300 rounded-lg p-8 text-center\">\n          <p className=\"text-lg font-medium text-muted-foreground mb-2\">No invoices yet</p>\n          <p className=\"text-sm text-muted-foreground\">Invoices will appear here after your first billing cycle</p>\n        </div>\n      )}\n\n      {/* Invoices List */}\n      {!loading && invoices.length > 0 && <InvoicesList invoices={invoices} onInvoicesChange={loadInvoices} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../../../../../shadcnui\";\nimport { formatCurrency, formatDate } from \"../../../components/utils\";\nimport { StripeInvoiceInterface } from \"../../data/stripe-invoice.interface\";\nimport { InvoiceDetails } from \"../details/InvoiceDetails\";\nimport { InvoiceStatusBadge } from \"../widgets/InvoiceStatusBadge\";\n\ntype InvoicesListProps = {\n  invoices: StripeInvoiceInterface[];\n  onInvoicesChange: () => void;\n};\n\nexport function InvoicesList({ invoices, onInvoicesChange }: InvoicesListProps) {\n  const [selectedInvoice, setSelectedInvoice] = useState<StripeInvoiceInterface | null>(null);\n\n  const handleRowClick = (invoice: StripeInvoiceInterface) => {\n    setSelectedInvoice(invoice);\n  };\n\n  const getInvoiceNumber = (invoice: StripeInvoiceInterface): string => {\n    if (invoice.stripeInvoiceNumber) {\n      return invoice.stripeInvoiceNumber;\n    }\n    // Use last 8 characters of stripeInvoiceId as fallback\n    return invoice.stripeInvoiceId.slice(-8);\n  };\n\n  return (\n    <>\n      <div className=\"border rounded-lg overflow-clip\">\n        <Table>\n          <TableHeader className=\"bg-muted\">\n            <TableRow>\n              <TableHead>Invoice #</TableHead>\n              <TableHead>Date</TableHead>\n              <TableHead>Status</TableHead>\n              <TableHead className=\"text-right\">Amount</TableHead>\n              <TableHead>Period</TableHead>\n            </TableRow>\n          </TableHeader>\n          <TableBody>\n            {invoices.map((invoice) => {\n              const invoiceNumber = getInvoiceNumber(invoice);\n              const date = formatDate(invoice.periodStart);\n              const amount = formatCurrency(invoice.total, invoice.currency);\n              const period = `${formatDate(invoice.periodStart)} - ${formatDate(invoice.periodEnd)}`;\n\n              return (\n                <TableRow\n                  key={invoice.id}\n                  onClick={() => handleRowClick(invoice)}\n                  className=\"cursor-pointer hover:bg-muted/50\"\n                >\n                  <TableCell className=\"font-medium\">{invoiceNumber}</TableCell>\n                  <TableCell className=\"text-muted-foreground text-xs\">{date}</TableCell>\n                  <TableCell>\n                    <InvoiceStatusBadge status={invoice.status} />\n                  </TableCell>\n                  <TableCell className=\"text-right font-medium\">{amount}</TableCell>\n                  <TableCell className=\"text-muted-foreground text-xs\">{period}</TableCell>\n                </TableRow>\n              );\n            })}\n          </TableBody>\n        </Table>\n      </div>\n\n      {/* Invoice Details Dialog */}\n      {selectedInvoice && (\n        <InvoiceDetails\n          invoice={selectedInvoice}\n          open={!!selectedInvoice}\n          onOpenChange={(open) => !open && setSelectedInvoice(null)}\n          onInvoiceChange={() => {\n            onInvoicesChange();\n            setSelectedInvoice(null);\n          }}\n        />\n      )}\n    </>\n  );\n}\n","/**\n * Format a date to a localized date string\n * @param date - Date object or ISO string\n * @returns Formatted date string (e.g., \"Jan 15, 2025\")\n */\nexport function formatDate(date: Date | string | undefined): string {\n  if (!date) return \"N/A\";\n\n  const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n  try {\n    return new Intl.DateTimeFormat(\"en-US\", {\n      month: \"short\",\n      day: \"numeric\",\n      year: \"numeric\",\n    }).format(dateObj);\n  } catch (error) {\n    console.error(\"Error formatting date:\", error);\n    return \"Invalid Date\";\n  }\n}\n","\"use client\";\n\nimport { Download, ExternalLink, RefreshCw } from \"lucide-react\";\nimport { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../../../../../shadcnui\";\nimport { formatCurrency, formatDate } from \"../../../components/utils\";\nimport { InvoiceStatus, StripeInvoiceInterface } from \"../../data/stripe-invoice.interface\";\nimport { InvoiceStatusBadge } from \"../widgets/InvoiceStatusBadge\";\n\ntype InvoiceDetailsProps = {\n  invoice: StripeInvoiceInterface;\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onInvoiceChange: () => void;\n};\n\nexport function InvoiceDetails({\n  invoice,\n  open,\n  onOpenChange,\n  onInvoiceChange: _onInvoiceChange,\n}: InvoiceDetailsProps) {\n  const handleDownloadPDF = () => {\n    if (invoice.stripePdfUrl) {\n      window.open(invoice.stripePdfUrl, \"_blank\");\n    }\n  };\n\n  const handleRetryPayment = async () => {\n    // TODO: Implement retry payment logic\n  };\n\n  const handleViewInStripe = () => {\n    if (invoice.stripeHostedInvoiceUrl) {\n      window.open(invoice.stripeHostedInvoiceUrl, \"_blank\");\n    }\n  };\n\n  const getInvoiceNumber = (): string => {\n    if (invoice.stripeInvoiceNumber) {\n      return invoice.stripeInvoiceNumber;\n    }\n    return invoice.stripeInvoiceId.slice(-8);\n  };\n\n  const productName = invoice.subscription?.price?.product?.name || \"Subscription\";\n\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className=\"max-w-2xl\">\n        <DialogHeader>\n          <DialogTitle>Invoice {getInvoiceNumber()}</DialogTitle>\n          <DialogDescription>{formatDate(invoice.periodStart)}</DialogDescription>\n        </DialogHeader>\n\n        <div className=\"space-y-6\">\n          {/* Status */}\n          <div className=\"flex items-center gap-x-3\">\n            <span className=\"text-sm font-medium text-muted-foreground\">Status:</span>\n            <InvoiceStatusBadge status={invoice.status} />\n          </div>\n\n          {/* Invoice Info Grid */}\n          <div className=\"grid grid-cols-2 gap-4\">\n            <div>\n              <span className=\"text-muted-foreground text-xs\">Billing Period:</span>\n              <p className=\"text-sm\">\n                {formatDate(invoice.periodStart)} - {formatDate(invoice.periodEnd)}\n              </p>\n            </div>\n\n            {invoice.dueDate && (\n              <div>\n                <span className=\"text-muted-foreground text-xs\">Due Date:</span>\n                <p className=\"text-sm\">{formatDate(invoice.dueDate)}</p>\n              </div>\n            )}\n\n            {invoice.paidAt && (\n              <div>\n                <span className=\"text-muted-foreground text-xs\">Paid Date:</span>\n                <p className=\"text-sm\">{formatDate(invoice.paidAt)}</p>\n              </div>\n            )}\n\n            <div>\n              <span className=\"text-muted-foreground text-xs\">Attempt Count:</span>\n              <p className=\"text-sm\">{invoice.attemptCount}</p>\n            </div>\n          </div>\n\n          {/* Line Items */}\n          <div>\n            <h4 className=\"text-sm font-medium text-muted-foreground mb-2\">Line Items</h4>\n            <div className=\"border rounded-lg overflow-clip\">\n              <table className=\"w-full\">\n                <thead className=\"bg-muted\">\n                  <tr>\n                    <th className=\"text-left p-3 text-sm font-medium\">Description</th>\n                    <th className=\"text-right p-3 text-sm font-medium\">Amount</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  <tr className=\"border-t\">\n                    <td className=\"p-3\">{productName}</td>\n                    <td className=\"p-3 text-right\">{formatCurrency(invoice.subtotal, invoice.currency)}</td>\n                  </tr>\n                </tbody>\n              </table>\n            </div>\n          </div>\n\n          {/* Amount Breakdown */}\n          <div className=\"space-y-2 border-t pt-4\">\n            <div className=\"flex justify-between\">\n              <span className=\"text-muted-foreground text-xs\">Subtotal:</span>\n              <span className=\"text-sm\">{formatCurrency(invoice.subtotal, invoice.currency)}</span>\n            </div>\n\n            {invoice.tax !== undefined && invoice.tax > 0 && (\n              <div className=\"flex justify-between\">\n                <span className=\"text-muted-foreground text-xs\">Tax:</span>\n                <span className=\"text-sm\">{formatCurrency(invoice.tax, invoice.currency)}</span>\n              </div>\n            )}\n\n            <div className=\"flex justify-between text-lg font-semibold border-t pt-2\">\n              <span>Total:</span>\n              <span>{formatCurrency(invoice.total, invoice.currency)}</span>\n            </div>\n\n            {invoice.amountPaid > 0 && (\n              <div className=\"flex justify-between\">\n                <span className=\"text-muted-foreground text-xs\">Amount Paid:</span>\n                <span className=\"text-sm text-success\">{formatCurrency(invoice.amountPaid, invoice.currency)}</span>\n              </div>\n            )}\n\n            {invoice.amountRemaining > 0 && (\n              <div className=\"flex justify-between\">\n                <span className=\"text-muted-foreground text-xs\">Amount Due:</span>\n                <span className=\"text-sm text-destructive\">\n                  {formatCurrency(invoice.amountRemaining, invoice.currency)}\n                </span>\n              </div>\n            )}\n          </div>\n\n          {/* Action Buttons */}\n          <div className=\"flex flex-wrap gap-2 pt-4 border-t\">\n            {invoice.stripePdfUrl && (\n              <Button variant=\"outline\" onClick={handleDownloadPDF}>\n                <Download className=\"mr-2 h-4 w-4\" />\n                Download PDF\n              </Button>\n            )}\n\n            {invoice.status === InvoiceStatus.OPEN && invoice.attempted && (\n              <Button variant=\"default\" onClick={handleRetryPayment}>\n                <RefreshCw className=\"mr-2 h-4 w-4\" />\n                Retry Payment\n              </Button>\n            )}\n\n            {invoice.stripeHostedInvoiceUrl && (\n              <Button variant=\"outline\" onClick={handleViewInStripe}>\n                <ExternalLink className=\"mr-2 h-4 w-4\" />\n                View in Stripe\n              </Button>\n            )}\n          </div>\n        </div>\n      </DialogContent>\n    </Dialog>\n  );\n}\n","\"use client\";\n\nimport { Badge, type BadgeProps } from \"../../../../../shadcnui\";\nimport { InvoiceStatus } from \"../../data/stripe-invoice.interface\";\n\ntype InvoiceStatusBadgeProps = {\n  status: InvoiceStatus;\n};\n\ntype StatusConfig = {\n  label: string;\n  variant: BadgeProps[\"variant\"];\n};\n\nconst statusConfig: Record<InvoiceStatus, StatusConfig> = {\n  [InvoiceStatus.DRAFT]: {\n    label: \"Draft\",\n    variant: \"softGray\",\n  },\n  [InvoiceStatus.OPEN]: {\n    label: \"Open\",\n    variant: \"softBlue\",\n  },\n  [InvoiceStatus.PAID]: {\n    label: \"Paid\",\n    variant: \"softGreen\",\n  },\n  [InvoiceStatus.VOID]: {\n    label: \"Void\",\n    variant: \"softGray\",\n  },\n  [InvoiceStatus.UNCOLLECTIBLE]: {\n    label: \"Uncollectible\",\n    variant: \"softRed\",\n  },\n};\n\nexport function InvoiceStatusBadge({ status }: InvoiceStatusBadgeProps) {\n  const config = statusConfig[status] || statusConfig[InvoiceStatus.DRAFT];\n\n  return <Badge variant={config.variant}>{config.label}</Badge>;\n}\n","\"use client\";\n\nimport { CreditCard } from \"lucide-react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Button } from \"../../../../../shadcnui\";\nimport { BillingAlertBanner } from \"../../../components\";\nimport { StripeSubscriptionInterface, StripeSubscriptionService, SubscriptionStatus } from \"../../data\";\nimport { SubscriptionsList } from \"../lists\";\n\ntype SubscriptionsContainerProps = {\n  onOpenWizard?: (subscription?: StripeSubscriptionInterface) => void;\n  hasActiveRecurringSubscription?: boolean;\n};\n\nexport function SubscriptionsContainer({ onOpenWizard, hasActiveRecurringSubscription }: SubscriptionsContainerProps) {\n  const [subscriptions, setSubscriptions] = useState<StripeSubscriptionInterface[]>([]);\n  const [loading, setLoading] = useState<boolean>(true);\n\n  const loadSubscriptions = useCallback(async () => {\n    setLoading(true);\n    try {\n      const fetchedSubscriptions = await StripeSubscriptionService.listSubscriptions();\n      setSubscriptions(fetchedSubscriptions);\n    } catch (error) {\n      console.error(\"[SubscriptionsContainer] Failed to load subscriptions:\", error);\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  useEffect(() => {\n    loadSubscriptions();\n  }, []);\n\n  // Detect critical subscriptions\n  const criticalSubscriptions = subscriptions.filter(\n    (sub) =>\n      sub.status === SubscriptionStatus.PAST_DUE ||\n      (sub.status === SubscriptionStatus.TRIALING &&\n        sub.trialEnd &&\n        new Date(sub.trialEnd).getTime() - new Date().getTime() <= 7 * 24 * 60 * 60 * 1000),\n  );\n\n  if (loading) {\n    return (\n      <div className=\"flex h-64 items-center justify-center\">\n        <p className=\"text-muted-foreground\">Loading subscriptions...</p>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"flex w-full flex-col gap-y-6\">\n      {/* Header */}\n      <div className=\"flex items-center justify-between\">\n        <div className=\"flex items-center gap-x-3\">\n          <CreditCard className=\"h-8 w-8\" />\n          <h1 className=\"text-primary text-3xl font-semibold\">Subscriptions</h1>\n        </div>\n        {subscriptions.length > 0 && (\n          <Button onClick={() => onOpenWizard?.()}>\n            {hasActiveRecurringSubscription ? \"Purchase Add-ons\" : \"Subscribe to a Plan\"}\n          </Button>\n        )}\n      </div>\n\n      {/* Alert Banners */}\n      {criticalSubscriptions.map((subscription) => (\n        <BillingAlertBanner key={subscription.id} subscription={subscription} />\n      ))}\n\n      {/* Empty state CTA */}\n      {subscriptions.length === 0 && (\n        <div className=\"flex flex-col items-center justify-center py-12 space-y-4\">\n          <CreditCard className=\"h-16 w-16 text-muted-foreground\" />\n          <div className=\"text-center\">\n            <h3 className=\"text-sm font-medium mb-2\">No Active Subscriptions</h3>\n            <p className=\"text-muted-foreground mb-6\">Choose a subscription plan to get started with our services.</p>\n            <Button onClick={() => onOpenWizard?.()}>Subscribe to a Plan</Button>\n          </div>\n        </div>\n      )}\n\n      {/* Subscriptions List */}\n      {subscriptions.length > 0 && (\n        <SubscriptionsList\n          subscriptions={subscriptions}\n          onSubscriptionsChange={loadSubscriptions}\n          onChangePlan={(sub) => onOpenWizard?.(sub)}\n        />\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../../../../../shadcnui\";\nimport { formatCurrency, formatDate } from \"../../../components/utils\";\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\nimport { StripeSubscriptionInterface, SubscriptionStatus } from \"../../data\";\nimport { SubscriptionDetails } from \"../details/SubscriptionDetails\";\nimport { SubscriptionStatusBadge } from \"../widgets/SubscriptionStatusBadge\";\n\n/**\n * Formats the plan name from price data.\n * Format: \"Product Name - Nickname (Interval)\" e.g., \"Only 35 - Pro (Monthly)\"\n */\nfunction formatPlanName(price: StripePriceInterface | undefined): string {\n  if (!price) return \"N/A\";\n\n  const productName = price.product?.name || \"\";\n  const nickname = price.nickname || \"\";\n\n  // Format interval: \"month\" -> \"Monthly\", \"year\" -> \"Yearly\", etc.\n  let interval = \"\";\n  if (price.recurring?.interval) {\n    const intervalMap: Record<string, string> = {\n      day: \"Daily\",\n      week: \"Weekly\",\n      month: \"Monthly\",\n      year: \"Yearly\",\n    };\n    interval = intervalMap[price.recurring.interval] || price.recurring.interval;\n  }\n\n  // Build the plan label: \"Product - Nickname\" or just \"Product\"\n  const parts = [productName, nickname].filter(Boolean);\n  const planLabel = parts.join(\" - \");\n\n  // Add interval in parentheses if available\n  return interval ? `${planLabel} (${interval})` : planLabel || \"N/A\";\n}\n\ntype SubscriptionsListProps = {\n  subscriptions: StripeSubscriptionInterface[];\n  onSubscriptionsChange: () => void;\n  onChangePlan?: (subscription: StripeSubscriptionInterface) => void;\n};\n\nexport function SubscriptionsList({ subscriptions, onSubscriptionsChange, onChangePlan }: SubscriptionsListProps) {\n  const [selectedSub, setSelectedSub] = useState<StripeSubscriptionInterface | null>(null);\n\n  const handleRowClick = (subscription: StripeSubscriptionInterface) => {\n    setSelectedSub(subscription);\n  };\n\n  return (\n    <>\n      <div className=\"border rounded-lg overflow-clip\">\n        <Table>\n          <TableHeader className=\"bg-muted\">\n            <TableRow>\n              <TableHead>Status</TableHead>\n              <TableHead>Plan</TableHead>\n              <TableHead>Period</TableHead>\n              <TableHead className=\"text-right\">Amount</TableHead>\n              <TableHead className=\"text-right\">Actions</TableHead>\n            </TableRow>\n          </TableHeader>\n          <TableBody>\n            {subscriptions.map((subscription) => {\n              const price = subscription.price;\n              const amount = price?.unitAmount ? formatCurrency(price.unitAmount, price.currency) : \"0\";\n              const period = `${formatDate(subscription.currentPeriodStart)} - ${formatDate(subscription.currentPeriodEnd)}`;\n\n              return (\n                <TableRow\n                  key={subscription.id}\n                  onClick={() => handleRowClick(subscription)}\n                  className=\"cursor-pointer hover:bg-muted/50\"\n                >\n                  <TableCell>\n                    <SubscriptionStatusBadge\n                      status={subscription.status}\n                      cancelAtPeriodEnd={subscription.cancelAtPeriodEnd}\n                    />\n                  </TableCell>\n                  <TableCell className=\"font-medium\">{formatPlanName(price)}</TableCell>\n                  <TableCell className=\"text-muted-foreground text-sm\">{period}</TableCell>\n                  <TableCell className=\"text-right font-medium\">{amount}</TableCell>\n                  <TableCell className=\"text-right\">\n                    {(subscription.status === SubscriptionStatus.ACTIVE ||\n                      subscription.status === SubscriptionStatus.TRIALING) &&\n                      onChangePlan && (\n                        <Button\n                          size=\"sm\"\n                          variant=\"outline\"\n                          onClick={(e) => {\n                            e.stopPropagation();\n                            onChangePlan(subscription);\n                          }}\n                        >\n                          Upgrade\n                        </Button>\n                      )}\n                  </TableCell>\n                </TableRow>\n              );\n            })}\n          </TableBody>\n        </Table>\n      </div>\n\n      {/* Subscription Details Dialog */}\n      {selectedSub && (\n        <SubscriptionDetails\n          subscription={selectedSub}\n          open={!!selectedSub}\n          onOpenChange={(open) => !open && setSelectedSub(null)}\n          onSubscriptionChange={() => {\n            onSubscriptionsChange();\n            setSelectedSub(null);\n          }}\n          onChangePlan={\n            onChangePlan\n              ? (sub) => {\n                  setSelectedSub(null); // Close details dialog first\n                  onChangePlan(sub); // Then open wizard at parent level\n                }\n              : undefined\n          }\n        />\n      )}\n    </>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../../../../../shadcnui\";\nimport { formatCurrency, formatDate } from \"../../../components/utils\";\nimport { StripeCustomerService } from \"../../../stripe-customer\";\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\nimport { StripeSubscriptionInterface, StripeSubscriptionService, SubscriptionStatus } from \"../../data\";\nimport { CancelSubscriptionDialog } from \"../forms/CancelSubscriptionDialog\";\nimport { SubscriptionStatusBadge } from \"../widgets/SubscriptionStatusBadge\";\n\n/**\n * Formats the plan name from price data.\n * Format: \"Product Name - Nickname (Interval)\" e.g., \"Only 35 - Pro (Monthly)\"\n */\nfunction formatPlanName(price: StripePriceInterface | undefined): string {\n  if (!price) return \"N/A\";\n\n  const productName = price.product?.name || \"\";\n  const nickname = price.nickname || \"\";\n\n  // Format interval: \"month\" -> \"Monthly\", \"year\" -> \"Yearly\", etc.\n  let interval = \"\";\n  if (price.recurring?.interval) {\n    const intervalMap: Record<string, string> = {\n      day: \"Daily\",\n      week: \"Weekly\",\n      month: \"Monthly\",\n      year: \"Yearly\",\n    };\n    interval = intervalMap[price.recurring.interval] || price.recurring.interval;\n  }\n\n  // Build the plan label: \"Product - Nickname\" or just \"Product\"\n  const parts = [productName, nickname].filter(Boolean);\n  const planLabel = parts.join(\" - \");\n\n  // Add interval in parentheses if available\n  return interval ? `${planLabel} (${interval})` : planLabel || \"N/A\";\n}\n\n/**\n * Formats the billing amount from price data.\n */\nfunction formatBillingAmount(price: StripePriceInterface | undefined): string {\n  if (!price?.unitAmount) return \"N/A\";\n  return formatCurrency(price.unitAmount, price.currency);\n}\n\ntype SubscriptionDetailsProps = {\n  subscription: StripeSubscriptionInterface;\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onSubscriptionChange: () => void;\n  onChangePlan?: (subscription: StripeSubscriptionInterface) => void;\n};\n\nexport function SubscriptionDetails({\n  subscription,\n  open,\n  onOpenChange,\n  onSubscriptionChange,\n  onChangePlan,\n}: SubscriptionDetailsProps) {\n  const [showCancel, setShowCancel] = useState<boolean>(false);\n  const [isProcessing, setIsProcessing] = useState<boolean>(false);\n\n  const handlePause = async () => {\n    setIsProcessing(true);\n    try {\n      await StripeSubscriptionService.pauseSubscription({ subscriptionId: subscription.id });\n      onSubscriptionChange();\n    } catch (error) {\n      console.error(\"[SubscriptionDetails] Failed to pause subscription:\", error);\n    } finally {\n      setIsProcessing(false);\n    }\n  };\n\n  const handleResume = async () => {\n    setIsProcessing(true);\n    try {\n      await StripeSubscriptionService.resumeSubscription({ subscriptionId: subscription.id });\n      onSubscriptionChange();\n    } catch (error) {\n      console.error(\"[SubscriptionDetails] Failed to resume subscription:\", error);\n    } finally {\n      setIsProcessing(false);\n    }\n  };\n\n  const handleManageViaPortal = async () => {\n    try {\n      const { url } = await StripeCustomerService.createPortalSession();\n      window.open(url, \"_blank\");\n    } catch (error) {\n      console.error(\"[SubscriptionDetails] Failed to create portal session:\", error);\n    }\n  };\n\n  const canPause = subscription.status === SubscriptionStatus.ACTIVE;\n  const canResume = subscription.status === SubscriptionStatus.PAUSED;\n  const canCancel =\n    subscription.status === SubscriptionStatus.ACTIVE ||\n    subscription.status === SubscriptionStatus.TRIALING ||\n    subscription.status === SubscriptionStatus.PAUSED;\n\n  return (\n    <>\n      <Dialog open={open} onOpenChange={onOpenChange}>\n        <DialogContent className=\"max-w-2xl\">\n          <DialogHeader>\n            <DialogTitle>Subscription Details</DialogTitle>\n            <DialogDescription>View and manage your subscription</DialogDescription>\n          </DialogHeader>\n\n          <div className=\"space-y-6\">\n            {/* Status */}\n            <div className=\"flex items-center gap-x-3\">\n              <span className=\"text-muted-foreground text-xs\">Status:</span>\n              <SubscriptionStatusBadge\n                status={subscription.status}\n                cancelAtPeriodEnd={subscription.cancelAtPeriodEnd}\n              />\n            </div>\n\n            {/* Plan Info */}\n            <div className=\"space-y-2\">\n              <div className=\"flex justify-between\">\n                <span className=\"text-muted-foreground text-xs\">Plan:</span>\n                <span className=\"text-sm\">{formatPlanName(subscription.price)}</span>\n              </div>\n              <div className=\"flex justify-between\">\n                <span className=\"text-muted-foreground text-xs\">Billing Amount:</span>\n                <span className=\"text-sm\">{formatBillingAmount(subscription.price)}</span>\n              </div>\n            </div>\n\n            {/* Current Period */}\n            <div className=\"space-y-2\">\n              <div className=\"flex justify-between\">\n                <span className=\"text-muted-foreground text-xs\">Current Period:</span>\n                <span className=\"text-sm\">\n                  {formatDate(subscription.currentPeriodStart)} - {formatDate(subscription.currentPeriodEnd)}\n                </span>\n              </div>\n            </div>\n\n            {/* Trial Info */}\n            {subscription.trialEnd && (\n              <div className=\"flex justify-between\">\n                <span className=\"text-muted-foreground text-xs\">Trial Ends:</span>\n                <span className=\"text-sm\">{formatDate(subscription.trialEnd)}</span>\n              </div>\n            )}\n\n            {/* Cancellation Warning */}\n            {subscription.cancelAtPeriodEnd && (\n              <div className=\"bg-warning/15 border-warning/30 rounded-lg border p-3\">\n                <p className=\"text-warning text-xs/relaxed\">\n                  This subscription will be canceled at the end of the current period on{\" \"}\n                  {formatDate(subscription.currentPeriodEnd)}.\n                </p>\n              </div>\n            )}\n\n            {/* Action Buttons */}\n            <div className=\"flex flex-wrap gap-2 pt-4 border-t\">\n              {onChangePlan && (\n                <Button variant=\"default\" onClick={() => onChangePlan(subscription)}>\n                  Change Plan\n                </Button>\n              )}\n\n              {canPause && (\n                <Button variant=\"outline\" onClick={handlePause} disabled={isProcessing}>\n                  {isProcessing ? \"Pausing...\" : \"Pause\"}\n                </Button>\n              )}\n\n              {canResume && (\n                <Button variant=\"outline\" onClick={handleResume} disabled={isProcessing}>\n                  {isProcessing ? \"Resuming...\" : \"Resume\"}\n                </Button>\n              )}\n\n              {canCancel && (\n                <Button variant=\"destructive\" onClick={() => setShowCancel(true)}>\n                  Cancel\n                </Button>\n              )}\n\n              <Button variant=\"outline\" onClick={handleManageViaPortal}>\n                Manage via Portal\n              </Button>\n            </div>\n          </div>\n        </DialogContent>\n      </Dialog>\n\n      {/* Cancel Subscription Dialog */}\n      {showCancel && (\n        <CancelSubscriptionDialog\n          subscription={subscription}\n          open={showCancel}\n          onOpenChange={setShowCancel}\n          onSuccess={() => {\n            onSubscriptionChange();\n            setShowCancel(false);\n          }}\n        />\n      )}\n    </>\n  );\n}\n","\"use client\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useState } from \"react\";\nimport { SubmitHandler, useForm } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport { FormTextarea } from \"../../../../../components\";\nimport {\n  Button,\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogHeader,\n  DialogTitle,\n  Form,\n} from \"../../../../../shadcnui\";\nimport { formatDate } from \"../../../components/utils\";\nimport { StripeSubscriptionInterface, StripeSubscriptionService } from \"../../data\";\n\ntype CancelSubscriptionDialogProps = {\n  subscription: StripeSubscriptionInterface;\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onSuccess: () => void;\n};\n\nconst formSchema = z.object({\n  reason: z.string().optional(),\n});\n\nexport function CancelSubscriptionDialog({\n  subscription,\n  open,\n  onOpenChange,\n  onSuccess,\n}: CancelSubscriptionDialogProps) {\n  const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n  const form = useForm<z.infer<typeof formSchema>>({\n    resolver: zodResolver(formSchema),\n    defaultValues: {\n      reason: \"\",\n    },\n  });\n\n  const onSubmit: SubmitHandler<z.infer<typeof formSchema>> = async (_values) => {\n    setIsSubmitting(true);\n\n    try {\n      await StripeSubscriptionService.cancelSubscription({\n        id: subscription.id,\n        cancelImmediately: false,\n      });\n\n      onSuccess();\n      onOpenChange(false);\n    } catch (error) {\n      console.error(\"[CancelSubscriptionDialog] Failed to cancel subscription:\", error);\n    } finally {\n      setIsSubmitting(false);\n    }\n  };\n\n  const periodEndDate = formatDate(subscription.currentPeriodEnd);\n\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className=\"max-w-md\">\n        <DialogHeader>\n          <DialogTitle>Cancel Subscription</DialogTitle>\n          <DialogDescription>\n            Are you sure you want to cancel this subscription? This action cannot be undone.\n          </DialogDescription>\n        </DialogHeader>\n\n        <Form {...form}>\n          <form onSubmit={form.handleSubmit(onSubmit)} className=\"flex flex-col gap-y-4\">\n            <div className=\"bg-primary/10 border-primary/30 text-foreground rounded-lg border p-3 text-sm\">\n              Your subscription will remain active until {periodEndDate}. You can continue using the service until then.\n            </div>\n\n            <FormTextarea\n              form={form}\n              id=\"reason\"\n              name=\"Reason (Optional)\"\n              placeholder=\"Let us know why you're canceling...\"\n              className=\"min-h-24\"\n            />\n\n            <div className=\"flex gap-x-2 justify-end pt-2\">\n              <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)} disabled={isSubmitting}>\n                Keep Subscription\n              </Button>\n              <Button type=\"submit\" variant=\"destructive\" disabled={isSubmitting}>\n                {isSubmitting ? \"Canceling...\" : \"Confirm Cancellation\"}\n              </Button>\n            </div>\n          </form>\n        </Form>\n      </DialogContent>\n    </Dialog>\n  );\n}\n","\"use client\";\n\nimport { Badge, type BadgeProps } from \"../../../../../shadcnui\";\nimport { SubscriptionStatus } from \"../../data\";\n\ntype SubscriptionStatusBadgeProps = {\n  status: SubscriptionStatus;\n  cancelAtPeriodEnd?: boolean;\n};\n\ntype StatusConfig = {\n  label: string;\n  variant: BadgeProps[\"variant\"];\n};\n\nconst statusConfig: Record<SubscriptionStatus, StatusConfig> = {\n  [SubscriptionStatus.ACTIVE]: {\n    label: \"Active\",\n    variant: \"softGreen\",\n  },\n  [SubscriptionStatus.TRIALING]: {\n    label: \"Trial\",\n    variant: \"softBlue\",\n  },\n  [SubscriptionStatus.PAST_DUE]: {\n    label: \"Past Due\",\n    variant: \"softRed\",\n  },\n  [SubscriptionStatus.CANCELED]: {\n    label: \"Canceled\",\n    variant: \"softGray\",\n  },\n  [SubscriptionStatus.PAUSED]: {\n    label: \"Paused\",\n    variant: \"softYellow\",\n  },\n  [SubscriptionStatus.UNPAID]: {\n    label: \"Unpaid\",\n    variant: \"softOrange\",\n  },\n  [SubscriptionStatus.INCOMPLETE]: {\n    label: \"Incomplete\",\n    variant: \"softGray\",\n  },\n  [SubscriptionStatus.INCOMPLETE_EXPIRED]: {\n    label: \"Expired\",\n    variant: \"softGray\",\n  },\n};\n\nconst cancelingConfig: StatusConfig = {\n  label: \"Canceling\",\n  variant: \"softAmber\",\n};\n\nexport function SubscriptionStatusBadge({ status, cancelAtPeriodEnd }: SubscriptionStatusBadgeProps) {\n  // Show \"Canceling\" when subscription is set to cancel at period end\n  const config = cancelAtPeriodEnd\n    ? cancelingConfig\n    : statusConfig[status] || statusConfig[SubscriptionStatus.CANCELED];\n\n  return <Badge variant={config.variant}>{config.label}</Badge>;\n}\n","\"use client\";\n\nimport { Tabs, TabsList, TabsTrigger } from \"../../../../../shadcnui\";\n\nexport type BillingInterval = \"month\" | \"year\";\n\nexport type IntervalToggleProps = {\n  value: BillingInterval;\n  onChange: (interval: BillingInterval) => void;\n  hasMonthly: boolean;\n  hasYearly: boolean;\n};\n\nexport function IntervalToggle({ value, onChange, hasMonthly, hasYearly }: IntervalToggleProps) {\n  // Only render if BOTH intervals are available\n  if (!hasMonthly || !hasYearly) {\n    return null;\n  }\n\n  return (\n    <Tabs value={value} onValueChange={(v) => onChange(v as BillingInterval)}>\n      <TabsList>\n        <TabsTrigger value=\"month\">Monthly</TabsTrigger>\n        <TabsTrigger value=\"year\">Yearly</TabsTrigger>\n      </TabsList>\n    </Tabs>\n  );\n}\n","\"use client\";\n\nimport { Check } from \"lucide-react\";\nimport { KeyboardEvent } from \"react\";\nimport { Badge, Button, Card, CardContent, CardFooter, CardHeader } from \"../../../../../shadcnui\";\nimport { formatCurrency, formatInterval } from \"../../../components/utils\";\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\nimport { cn } from \"../../../../../utils/cn\";\n\nexport type PricingCardProps = {\n  price: StripePriceInterface;\n  isCurrentPlan?: boolean;\n  isSelected?: boolean;\n  isDisabled?: boolean;\n  isLoading?: boolean;\n  onSelect: (price: StripePriceInterface) => void;\n};\n\nexport function PricingCard({\n  price,\n  isCurrentPlan = false,\n  isSelected = false,\n  isDisabled = false,\n  isLoading = false,\n  onSelect,\n}: PricingCardProps) {\n  const description = price.description || price.nickname || \"Standard\";\n  const features = price.features || [];\n  const formattedPrice = formatCurrency(price.unitAmount, price.currency);\n  const interval = formatInterval(price);\n\n  const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n    if ((e.key === \"Enter\" || e.key === \" \") && !isDisabled && !isCurrentPlan) {\n      e.preventDefault();\n      onSelect(price);\n    }\n  };\n\n  const handleClick = () => {\n    if (!isDisabled && !isCurrentPlan && !isLoading) {\n      onSelect(price);\n    }\n  };\n\n  return (\n    <Card\n      role=\"radio\"\n      aria-checked={isSelected}\n      aria-label={`${description} plan at ${formattedPrice} ${interval}`}\n      tabIndex={isDisabled ? -1 : 0}\n      onKeyDown={handleKeyDown}\n      onClick={handleClick}\n      className={cn(\n        \"relative cursor-pointer transition-all duration-200 flex flex-col h-full\",\n        \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n        isCurrentPlan && \"bg-muted/30\",\n        isSelected && !isCurrentPlan && \"ring-2 ring-primary\",\n        !isDisabled && !isCurrentPlan && \"hover:shadow-md hover:border-primary/50\",\n        isDisabled && \"opacity-50 pointer-events-none\",\n        isLoading && \"pointer-events-none\",\n      )}\n    >\n      {isCurrentPlan && (\n        <Badge variant=\"secondary\" className=\"absolute top-2 right-2\">\n          Current\n        </Badge>\n      )}\n\n      <CardHeader className=\"pb-2\">\n        <h3 className=\"text-sm font-medium\">{description}</h3>\n      </CardHeader>\n\n      <CardContent className=\"pb-4 grow\">\n        <div className=\"mb-4\">\n          <span className=\"text-3xl font-bold\">{formattedPrice}</span>\n          <span className=\"text-muted-foreground ml-1\">{interval}</span>\n        </div>\n\n        {features.length > 0 && (\n          <ul className=\"space-y-2\">\n            {features.map((feature, index) => (\n              <li key={index} className=\"flex items-start gap-2\">\n                <Check className=\"text-success mt-0.5 h-4 w-4 shrink-0\" />\n                <span className=\"text-sm text-muted-foreground\">{feature}</span>\n              </li>\n            ))}\n          </ul>\n        )}\n      </CardContent>\n\n      <CardFooter>\n        <Button\n          variant={isCurrentPlan ? \"secondary\" : isSelected ? \"default\" : \"outline\"}\n          className=\"w-full\"\n          disabled={isDisabled || isCurrentPlan || isLoading}\n        >\n          {isLoading ? \"Processing...\" : isCurrentPlan ? \"Current Plan\" : isSelected ? \"Selected\" : \"Select Plan\"}\n        </Button>\n      </CardFooter>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\nimport { StripeProductInterface } from \"../../../stripe-product\";\nimport { SectionHeader } from \"../../../../../components/typography\";\nimport { PricingCard } from \"./PricingCard\";\n\nexport type ProductPricingRowProps = {\n  product: StripeProductInterface;\n  prices: StripePriceInterface[]; // Multiple prices for this product\n  currentPriceId?: string;\n  selectedPriceId?: string;\n  loadingPriceId?: string;\n  onSelectPrice: (price: StripePriceInterface) => void;\n};\n\nexport function ProductPricingRow({\n  product,\n  prices,\n  currentPriceId,\n  selectedPriceId,\n  loadingPriceId,\n  onSelectPrice,\n}: ProductPricingRowProps) {\n  if (prices.length === 0) {\n    return null;\n  }\n\n  return (\n    <div className=\"space-y-3\">\n      {/* Product name header */}\n      <SectionHeader>{product.name}</SectionHeader>\n\n      {/* Price cards in columns */}\n      <div\n        className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\"\n        role=\"radiogroup\"\n        aria-label={`Pricing options for ${product.name}`}\n      >\n        {prices\n          .sort((a, b) => (a.unitAmount ?? 0) - (b.unitAmount ?? 0))\n          .map((price) => (\n            <PricingCard\n              key={price.id}\n              price={price}\n              isCurrentPlan={price.id === currentPriceId}\n              isSelected={price.id === selectedPriceId}\n              isLoading={price.id === loadingPriceId}\n              onSelect={onSelectPrice}\n            />\n          ))}\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { Skeleton } from \"../../../../../shadcnui\";\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\nimport { StripeProductInterface } from \"../../../stripe-product\";\nimport { BillingInterval } from \"./IntervalToggle\";\nimport { ProductPricingRow } from \"./ProductPricingRow\";\n\nexport type ProductPricingListProps = {\n  products: StripeProductInterface[];\n  selectedInterval: BillingInterval;\n  currentPriceId?: string;\n  selectedPriceId?: string;\n  loadingPriceId?: string;\n  loading?: boolean;\n  onSelectPrice: (price: StripePriceInterface) => void;\n  hideRecurringPrices?: boolean;\n  hideOneTimePrices?: boolean;\n};\n\nfunction isRecurringProduct(prices: StripePriceInterface[]): boolean {\n  return prices.some((p) => p.priceType === \"recurring\");\n}\n\nfunction getFilteredPrices(prices: StripePriceInterface[], selectedInterval: BillingInterval): StripePriceInterface[] {\n  const isRecurring = isRecurringProduct(prices);\n\n  if (!isRecurring) {\n    return prices.filter((p) => p.priceType === \"one_time\");\n  }\n\n  const intervalPrices = prices.filter(\n    (p) => p.priceType === \"recurring\" && p.recurring?.interval === selectedInterval,\n  );\n\n  if (intervalPrices.length === 0) {\n    const fallbackInterval = selectedInterval === \"month\" ? \"year\" : \"month\";\n    return prices.filter((p) => p.priceType === \"recurring\" && p.recurring?.interval === fallbackInterval);\n  }\n\n  return intervalPrices;\n}\n\nexport function ProductPricingList({\n  products,\n  selectedInterval,\n  currentPriceId,\n  selectedPriceId,\n  loadingPriceId,\n  loading = false,\n  onSelectPrice,\n  hideRecurringPrices = false,\n  hideOneTimePrices = false,\n}: ProductPricingListProps) {\n  if (loading) {\n    return <ProductPricingListSkeleton />;\n  }\n\n  if (products.length === 0) {\n    return <div className=\"text-center py-8 text-muted-foreground\">No plans available</div>;\n  }\n\n  const sortedProducts = [...products].sort((a, b) => {\n    const aRecurring = isRecurringProduct(a.stripePrices || []);\n    const bRecurring = isRecurringProduct(b.stripePrices || []);\n    if (aRecurring && !bRecurring) return -1;\n    if (!aRecurring && bRecurring) return 1;\n    return 0;\n  });\n\n  return (\n    <div className=\"space-y-6\">\n      {sortedProducts.map((product) => {\n        const allPrices = product.stripePrices || [];\n\n        // Filter prices based on hideRecurringPrices and hideOneTimePrices flags\n        let pricesToFilter = allPrices;\n\n        if (hideRecurringPrices) {\n          pricesToFilter = pricesToFilter.filter((price) => price.priceType !== \"recurring\");\n        }\n\n        if (hideOneTimePrices) {\n          pricesToFilter = pricesToFilter.filter((price) => price.priceType !== \"one_time\");\n        }\n\n        // Filter out trial prices - users shouldn't manually select trial plans\n        pricesToFilter = pricesToFilter.filter((price) => !price.isTrial);\n\n        const filteredPrices = getFilteredPrices(pricesToFilter, selectedInterval);\n\n        if (filteredPrices.length === 0) {\n          return null;\n        }\n\n        return (\n          <ProductPricingRow\n            key={product.id}\n            product={product}\n            prices={filteredPrices}\n            currentPriceId={currentPriceId}\n            selectedPriceId={selectedPriceId}\n            loadingPriceId={loadingPriceId}\n            onSelectPrice={onSelectPrice}\n          />\n        );\n      })}\n    </div>\n  );\n}\n\nfunction ProductPricingListSkeleton() {\n  return (\n    <div className=\"space-y-6\">\n      {[1, 2].map((rowIndex) => (\n        <div key={rowIndex} className=\"space-y-3\">\n          <Skeleton className=\"h-6 w-32\" />\n          <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n            {[1, 2, 3].map((cardIndex) => (\n              <div key={cardIndex} className=\"p-4 rounded-lg border animate-pulse space-y-3\">\n                <Skeleton className=\"h-6 w-24\" />\n                <Skeleton className=\"h-8 w-32\" />\n                <div className=\"space-y-2\">\n                  <Skeleton className=\"h-4 w-full\" />\n                  <Skeleton className=\"h-4 w-3/4\" />\n                </div>\n                <Skeleton className=\"h-10 w-full\" />\n              </div>\n            ))}\n          </div>\n        </div>\n      ))}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { ProrationPreviewInterface } from \"../../../stripe-invoice/data/stripe-invoice.interface\";\nimport { formatCurrency, formatDate } from \"../../../components/utils\";\n\ntype ProrationPreviewProps = {\n  preview: ProrationPreviewInterface;\n};\n\nexport function ProrationPreview({ preview }: ProrationPreviewProps) {\n  return (\n    <div className=\"bg-primary/10 border-primary/30 rounded-lg border p-4\">\n      <h4 className=\"text-primary mb-3 font-semibold\">Proration Breakdown</h4>\n\n      <div className=\"space-y-2\">\n        {preview.lineItems.map((item, index) => (\n          <div key={index} className=\"flex justify-between text-sm\">\n            <span className=\"text-muted-foreground\">{item.description}</span>\n            <span className={`font-medium ${item.amount < 0 ? \"text-success\" : \"text-foreground\"}`}>\n              {formatCurrency(item.amount, preview.currency)}\n            </span>\n          </div>\n        ))}\n\n        <div className=\"border-primary/30 mt-2 border-t pt-2\">\n          <div className=\"flex justify-between font-semibold\">\n            <span className=\"text-foreground\">Net Due Today</span>\n            <span className=\"text-foreground\">{formatCurrency(preview.immediateCharge, preview.currency)}</span>\n          </div>\n        </div>\n\n        {preview.lineItems.length > 0 && preview.lineItems[0].period && (\n          <div className=\"text-muted-foreground mt-2 text-xs\">\n            Next invoice on {formatDate(preview.lineItems[0].period.end)} for{\" \"}\n            {formatCurrency(preview.amountDue, preview.currency)}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { Check, Loader2 } from \"lucide-react\";\nimport { Button } from \"../../../../../shadcnui\";\nimport { formatCurrency, formatInterval } from \"../../../components/utils\";\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\n\ntype SubscriptionConfirmationProps = {\n  price: StripePriceInterface;\n  isLoading: boolean;\n  onConfirm: () => void;\n  onCancel: () => void;\n};\n\nexport function SubscriptionConfirmation({ price, isLoading, onConfirm, onCancel }: SubscriptionConfirmationProps) {\n  const productName = price.product?.name || price.nickname || \"Selected Plan\";\n  const productDescription = price.product?.description || price.description;\n  const features = price.features || [];\n\n  return (\n    <div className=\"bg-accent/10 border border-accent/30 rounded-lg p-4\">\n      <h4 className=\"font-semibold mb-3\">Confirm Your Subscription</h4>\n\n      <div className=\"space-y-3\">\n        {/* Plan name and description */}\n        <div>\n          <div className=\"font-medium\">{productName}</div>\n          {productDescription && <div className=\"text-sm text-muted-foreground\">{productDescription}</div>}\n        </div>\n\n        {/* Price */}\n        <div className=\"text-lg font-semibold\">\n          {formatCurrency(price.unitAmount, price.currency)}\n          <span className=\"text-sm font-normal text-muted-foreground\">{formatInterval(price)}</span>\n        </div>\n\n        {/* Features */}\n        {features.length > 0 && (\n          <div className=\"space-y-1\">\n            {features.map((feature, index) => (\n              <div key={index} className=\"flex items-center gap-2 text-sm \">\n                <Check className=\"h-4 w-4 text-primary\" />\n                <span>{feature}</span>\n              </div>\n            ))}\n          </div>\n        )}\n\n        {/* Action buttons */}\n        <div className=\"flex justify-end gap-3 pt-2 border-t border-accent/30\">\n          <Button variant=\"outline\" onClick={onCancel} disabled={isLoading}>\n            Cancel\n          </Button>\n          <Button onClick={onConfirm} disabled={isLoading}>\n            {isLoading ? (\n              <>\n                <Loader2 className=\"h-4 w-4 animate-spin mr-2\" />\n                Processing...\n              </>\n            ) : (\n              \"Subscribe\"\n            )}\n          </Button>\n        </div>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../../../../../shadcnui\";\nimport { StripeSubscriptionInterface } from \"../../data\";\nimport { useSubscriptionWizard } from \"../../hooks/useSubscriptionWizard\";\nimport { WizardProgressIndicator } from \"./WizardProgressIndicator\";\nimport { WizardStepPlanSelection } from \"./WizardStepPlanSelection\";\nimport { WizardStepReview } from \"./WizardStepReview\";\nimport { WizardStepPaymentMethod } from \"./WizardStepPaymentMethod\";\n\nexport type SubscriptionWizardProps = {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  onSuccess: () => void;\n  hasActiveRecurringSubscription: boolean;\n  subscription?: StripeSubscriptionInterface;\n};\n\nexport function SubscriptionWizard({\n  open,\n  onOpenChange,\n  onSuccess,\n  hasActiveRecurringSubscription,\n  subscription,\n}: SubscriptionWizardProps) {\n  const handleClose = useCallback(() => onOpenChange(false), [onOpenChange]);\n\n  const { state, actions } = useSubscriptionWizard({\n    subscription,\n    onSuccess,\n    onClose: handleClose,\n  });\n\n  // Track if we've already checked payment method for this open state\n  const hasCheckedRef = useRef(false);\n\n  // Check payment method on mount\n  useEffect(() => {\n    if (open && !hasCheckedRef.current) {\n      hasCheckedRef.current = true;\n      actions.checkPaymentMethod();\n    }\n    if (!open) {\n      hasCheckedRef.current = false;\n    }\n  }, [open, actions.checkPaymentMethod]);\n\n  // Reset state when dialog closes\n  useEffect(() => {\n    if (!open) {\n      actions.reset();\n    }\n  }, [open, actions.reset]);\n\n  const isPurchasingAddons = hasActiveRecurringSubscription && !subscription;\n  const isChangePlanMode = !!subscription;\n\n  const dialogTitle = subscription\n    ? \"Change Subscription Plan\"\n    : isPurchasingAddons\n      ? \"Purchase Add-ons\"\n      : \"Subscribe to a Plan\";\n\n  const dialogDescription = subscription\n    ? \"Select a new plan for your subscription\"\n    : isPurchasingAddons\n      ? \"Select one-time products to purchase\"\n      : \"Choose a subscription plan to get started\";\n\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className=\"max-w-2xl\">\n        <DialogHeader>\n          <DialogTitle>{dialogTitle}</DialogTitle>\n          <DialogDescription>{dialogDescription}</DialogDescription>\n        </DialogHeader>\n\n        <WizardProgressIndicator currentStep={state.step} />\n\n        {state.step === \"plan-selection\" && (\n          <WizardStepPlanSelection\n            selectedPrice={state.selectedPrice}\n            selectedInterval={state.selectedInterval}\n            currentPriceId={subscription?.price?.id}\n            hideRecurringPrices={isPurchasingAddons}\n            hideOneTimePrices={isChangePlanMode}\n            onSelectPrice={actions.selectPrice}\n            onIntervalChange={actions.setInterval}\n            onNext={actions.goToReview}\n            isProcessing={state.isProcessing}\n          />\n        )}\n\n        {state.step === \"review\" && (\n          <WizardStepReview\n            selectedPrice={state.selectedPrice}\n            subscription={subscription}\n            prorationPreview={state.prorationPreview}\n            hasPaymentMethod={state.hasPaymentMethod}\n            error={state.error}\n            isProcessing={state.isProcessing}\n            onBack={() => actions.goToStep(\"plan-selection\")}\n            onAddPaymentMethod={() => actions.goToStep(\"payment-method\")}\n            onConfirm={actions.confirmSubscription}\n            promotionCode={state.promotionCode}\n            isValidatingPromoCode={state.isValidatingPromoCode}\n            promoCodeError={state.promoCodeError}\n            onApplyPromoCode={actions.validatePromoCode}\n            onRemovePromoCode={actions.clearPromoCode}\n            isTrialUpgrade={state.isTrialSubscription}\n          />\n        )}\n\n        {state.step === \"payment-method\" && (\n          <WizardStepPaymentMethod\n            onBack={() => actions.goToStep(\"review\")}\n            onSuccess={actions.handlePaymentMethodSuccess}\n            isProcessing={state.isProcessing}\n          />\n        )}\n      </DialogContent>\n    </Dialog>\n  );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useReducer, useRef } from \"react\";\nimport { v4 } from \"uuid\";\nimport { StripeCustomerService } from \"../../stripe-customer/data/stripe-customer.service\";\nimport { ProrationPreviewInterface } from \"../../stripe-invoice/data/stripe-invoice.interface\";\nimport { StripePriceInterface } from \"../../stripe-price/data/stripe-price.interface\";\nimport { PromotionCodeValidationResult, StripePromotionCodeService } from \"../../stripe-promotion-code\";\nimport { BillingInterval } from \"../components/widgets/IntervalToggle\";\nimport { StripeSubscriptionInterface, StripeSubscriptionService, SubscriptionStatus } from \"../data\";\n\nexport type WizardStep = \"plan-selection\" | \"review\" | \"payment-method\";\n\nexport type WizardState = {\n  step: WizardStep;\n  selectedPrice: StripePriceInterface | null;\n  selectedInterval: BillingInterval;\n  hasPaymentMethod: boolean;\n  isProcessing: boolean;\n  error: string | null;\n  prorationPreview: ProrationPreviewInterface | null;\n  // Promotion code state\n  promotionCode: PromotionCodeValidationResult | null;\n  isValidatingPromoCode: boolean;\n  promoCodeError: string | null;\n  // Trial state\n  isTrialSubscription: boolean;\n};\n\ntype WizardAction =\n  | { type: \"SET_STEP\"; step: WizardStep }\n  | { type: \"SELECT_PRICE\"; price: StripePriceInterface }\n  | { type: \"SET_INTERVAL\"; interval: BillingInterval }\n  | { type: \"SET_HAS_PAYMENT_METHOD\"; hasMethod: boolean }\n  | { type: \"SET_PROCESSING\"; isProcessing: boolean }\n  | { type: \"SET_ERROR\"; error: string | null }\n  | { type: \"SET_PRORATION_PREVIEW\"; preview: ProrationPreviewInterface | null }\n  | { type: \"SET_PROMOTION_CODE\"; code: PromotionCodeValidationResult | null }\n  | { type: \"SET_VALIDATING_PROMO_CODE\"; isValidating: boolean }\n  | { type: \"SET_PROMO_CODE_ERROR\"; error: string | null }\n  | { type: \"SET_IS_TRIAL_SUBSCRIPTION\"; isTrial: boolean }\n  | { type: \"RESET\" };\n\nconst initialState: WizardState = {\n  step: \"plan-selection\",\n  selectedPrice: null,\n  selectedInterval: \"month\",\n  hasPaymentMethod: false,\n  isProcessing: false,\n  error: null,\n  prorationPreview: null,\n  promotionCode: null,\n  isValidatingPromoCode: false,\n  promoCodeError: null,\n  isTrialSubscription: false,\n};\n\nfunction wizardReducer(state: WizardState, action: WizardAction): WizardState {\n  switch (action.type) {\n    case \"SET_STEP\":\n      return { ...state, step: action.step, error: null };\n    case \"SELECT_PRICE\":\n      return { ...state, selectedPrice: action.price };\n    case \"SET_INTERVAL\":\n      return { ...state, selectedInterval: action.interval };\n    case \"SET_HAS_PAYMENT_METHOD\":\n      return { ...state, hasPaymentMethod: action.hasMethod };\n    case \"SET_PROCESSING\":\n      return { ...state, isProcessing: action.isProcessing };\n    case \"SET_ERROR\":\n      return { ...state, error: action.error };\n    case \"SET_PRORATION_PREVIEW\":\n      return { ...state, prorationPreview: action.preview };\n    case \"SET_PROMOTION_CODE\":\n      return { ...state, promotionCode: action.code, promoCodeError: null };\n    case \"SET_VALIDATING_PROMO_CODE\":\n      return { ...state, isValidatingPromoCode: action.isValidating };\n    case \"SET_PROMO_CODE_ERROR\":\n      return { ...state, promoCodeError: action.error };\n    case \"SET_IS_TRIAL_SUBSCRIPTION\":\n      return { ...state, isTrialSubscription: action.isTrial };\n    case \"RESET\":\n      return initialState;\n    default:\n      return state;\n  }\n}\n\nexport type UseSubscriptionWizardOptions = {\n  subscription?: StripeSubscriptionInterface;\n  onSuccess: () => void;\n  onClose: () => void;\n};\n\nexport function useSubscriptionWizard({ subscription, onSuccess, onClose }: UseSubscriptionWizardOptions) {\n  const [state, dispatch] = useReducer(wizardReducer, {\n    ...initialState,\n    selectedPrice: subscription?.price || null,\n  });\n\n  // Use refs for callbacks to avoid dependency changes\n  const onSuccessRef = useRef(onSuccess);\n  const onCloseRef = useRef(onClose);\n  onSuccessRef.current = onSuccess;\n  onCloseRef.current = onClose;\n\n  const checkPaymentMethod = useCallback(async () => {\n    try {\n      const methods = await StripeCustomerService.listPaymentMethods();\n      dispatch({ type: \"SET_HAS_PAYMENT_METHOD\", hasMethod: methods.length > 0 });\n    } catch (error) {\n      console.error(\"[useSubscriptionWizard] Failed to check payment methods:\", error);\n      dispatch({ type: \"SET_HAS_PAYMENT_METHOD\", hasMethod: false });\n    }\n  }, []);\n\n  const selectPrice = useCallback((price: StripePriceInterface) => {\n    dispatch({ type: \"SELECT_PRICE\", price });\n  }, []);\n\n  const setInterval = useCallback((interval: BillingInterval) => {\n    dispatch({ type: \"SET_INTERVAL\", interval });\n  }, []);\n\n  const goToStep = useCallback((step: WizardStep) => {\n    dispatch({ type: \"SET_STEP\", step });\n  }, []);\n\n  const goToReview = useCallback(async () => {\n    if (!state.selectedPrice) return;\n\n    dispatch({ type: \"SET_PROCESSING\", isProcessing: true });\n\n    try {\n      // Check payment method first\n      await checkPaymentMethod();\n\n      // Check if current subscription is trial\n      const isTrialUpgrade = subscription?.status === SubscriptionStatus.TRIALING;\n      dispatch({ type: \"SET_IS_TRIAL_SUBSCRIPTION\", isTrial: isTrialUpgrade });\n\n      // For trial upgrades, require payment method before review\n      if (isTrialUpgrade && !state.hasPaymentMethod) {\n        const methods = await StripeCustomerService.listPaymentMethods();\n        if (methods.length === 0) {\n          dispatch({ type: \"SET_STEP\", step: \"payment-method\" });\n          dispatch({\n            type: \"SET_ERROR\",\n            error: \"A payment method is required to upgrade from your trial.\",\n          });\n          return;\n        }\n      }\n\n      // If editing subscription, get proration preview\n      if (subscription && state.selectedPrice.id !== subscription.price?.id) {\n        const preview = await StripeSubscriptionService.getProrationPreview({\n          subscriptionId: subscription.id,\n          newPriceId: state.selectedPrice.id,\n        });\n        dispatch({ type: \"SET_PRORATION_PREVIEW\", preview });\n      }\n\n      dispatch({ type: \"SET_STEP\", step: \"review\" });\n    } catch (error: any) {\n      console.error(\"[useSubscriptionWizard] Error preparing review:\", error);\n      dispatch({ type: \"SET_ERROR\", error: error?.message || \"Failed to prepare review\" });\n    } finally {\n      dispatch({ type: \"SET_PROCESSING\", isProcessing: false });\n    }\n  }, [state.selectedPrice, state.hasPaymentMethod, subscription, checkPaymentMethod]);\n\n  const confirmSubscription = useCallback(async () => {\n    if (!state.selectedPrice) return;\n\n    dispatch({ type: \"SET_PROCESSING\", isProcessing: true });\n    dispatch({ type: \"SET_ERROR\", error: null });\n\n    try {\n      if (subscription) {\n        // Change existing subscription\n        const changePlanParams = {\n          id: subscription.id,\n          newPriceId: state.selectedPrice.id,\n          promotionCode: state.promotionCode?.promotionCodeId,\n        };\n        await StripeSubscriptionService.changePlan(changePlanParams);\n      } else {\n        // Create new subscription\n        const createParams = {\n          id: v4(),\n          priceId: state.selectedPrice.id,\n          promotionCode: state.promotionCode?.promotionCodeId,\n        };\n        await StripeSubscriptionService.createSubscription(createParams);\n      }\n\n      onSuccessRef.current();\n      onCloseRef.current();\n    } catch (error: any) {\n      // Handle 409 Conflict - duplicate recurring subscription\n      if (error?.status === 409 || error?.response?.status === 409) {\n        dispatch({\n          type: \"SET_ERROR\",\n          error: \"You already have an active subscription. Please change your existing plan instead.\",\n        });\n        return;\n      }\n\n      // Handle 402 - payment method required\n      if (error?.status === 402 || error?.response?.status === 402) {\n        dispatch({ type: \"SET_HAS_PAYMENT_METHOD\", hasMethod: false });\n        dispatch({ type: \"SET_STEP\", step: \"payment-method\" });\n        return;\n      }\n\n      dispatch({ type: \"SET_ERROR\", error: error?.message || \"Failed to process subscription\" });\n    } finally {\n      dispatch({ type: \"SET_PROCESSING\", isProcessing: false });\n    }\n  }, [state.selectedPrice, state.promotionCode, subscription]);\n\n  const handlePaymentMethodSuccess = useCallback(async () => {\n    dispatch({ type: \"SET_HAS_PAYMENT_METHOD\", hasMethod: true });\n    // Go back to review to confirm subscription\n    dispatch({ type: \"SET_STEP\", step: \"review\" });\n  }, []);\n\n  const reset = useCallback(() => {\n    dispatch({ type: \"RESET\" });\n  }, []);\n\n  const validatePromoCode = useCallback(\n    async (code: string) => {\n      dispatch({ type: \"SET_VALIDATING_PROMO_CODE\", isValidating: true });\n      dispatch({ type: \"SET_PROMO_CODE_ERROR\", error: null });\n\n      try {\n        const result = await StripePromotionCodeService.validatePromotionCode({\n          code,\n          stripePriceId: state.selectedPrice?.id,\n        });\n\n        if (result.valid) {\n          dispatch({ type: \"SET_PROMOTION_CODE\", code: result });\n        } else {\n          dispatch({ type: \"SET_PROMO_CODE_ERROR\", error: result.errorMessage || \"Invalid promotion code\" });\n        }\n      } catch (error: any) {\n        console.error(\"[useSubscriptionWizard] Promo code validation error:\", error);\n        dispatch({ type: \"SET_PROMO_CODE_ERROR\", error: error?.message || \"Failed to validate promotion code\" });\n      } finally {\n        dispatch({ type: \"SET_VALIDATING_PROMO_CODE\", isValidating: false });\n      }\n    },\n    [state.selectedPrice?.id],\n  );\n\n  const clearPromoCode = useCallback(() => {\n    dispatch({ type: \"SET_PROMOTION_CODE\", code: null });\n    dispatch({ type: \"SET_PROMO_CODE_ERROR\", error: null });\n    dispatch({ type: \"SET_ERROR\", error: null });\n  }, []);\n\n  const actions = useMemo(\n    () => ({\n      selectPrice,\n      setInterval,\n      goToStep,\n      goToReview,\n      confirmSubscription,\n      handlePaymentMethodSuccess,\n      checkPaymentMethod,\n      reset,\n      validatePromoCode,\n      clearPromoCode,\n    }),\n    [\n      selectPrice,\n      setInterval,\n      goToStep,\n      goToReview,\n      confirmSubscription,\n      handlePaymentMethodSuccess,\n      checkPaymentMethod,\n      reset,\n      validatePromoCode,\n      clearPromoCode,\n    ],\n  );\n\n  return {\n    state,\n    actions,\n  };\n}\n","\"use client\";\n\nimport { Check } from \"lucide-react\";\nimport { WizardStep } from \"../../hooks/useSubscriptionWizard\";\n\ntype WizardProgressIndicatorProps = {\n  currentStep: WizardStep;\n};\n\nconst STEPS: { key: WizardStep; label: string }[] = [\n  { key: \"plan-selection\", label: \"Select Plan\" },\n  { key: \"review\", label: \"Review\" },\n  { key: \"payment-method\", label: \"Payment\" },\n];\n\nfunction getStepIndex(step: WizardStep): number {\n  return STEPS.findIndex((s) => s.key === step);\n}\n\nexport function WizardProgressIndicator({ currentStep }: WizardProgressIndicatorProps) {\n  const currentIndex = getStepIndex(currentStep);\n\n  return (\n    <div className=\"flex items-center justify-center gap-x-2 py-4\">\n      {STEPS.map((step, index) => {\n        const isCompleted = index < currentIndex;\n        const isCurrent = index === currentIndex;\n\n        return (\n          <div key={step.key} className=\"flex items-center gap-x-2\">\n            {/* Step Indicator */}\n            <div\n              className={`flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium ${\n                isCompleted\n                  ? \"bg-primary text-primary-foreground\"\n                  : isCurrent\n                    ? \"bg-primary text-primary-foreground\"\n                    : \"bg-muted text-muted-foreground\"\n              }`}\n            >\n              {isCompleted ? <Check className=\"h-4 w-4\" /> : index + 1}\n            </div>\n\n            {/* Step Label */}\n            <span className={`text-sm ${isCurrent ? \"font-medium text-foreground\" : \"text-muted-foreground\"}`}>\n              {step.label}\n            </span>\n\n            {/* Connector */}\n            {index < STEPS.length - 1 && (\n              <div className={`h-0.5 w-8 ${index < currentIndex ? \"bg-primary\" : \"bg-muted\"}`} />\n            )}\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"../../../../../shadcnui\";\nimport { StripeProductInterface, StripeProductService } from \"../../../stripe-product\";\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\nimport { BillingInterval, IntervalToggle } from \"../widgets/IntervalToggle\";\nimport { ProductPricingList } from \"../widgets/ProductPricingList\";\n\ntype WizardStepPlanSelectionProps = {\n  selectedPrice: StripePriceInterface | null;\n  selectedInterval: BillingInterval;\n  currentPriceId?: string;\n  hideRecurringPrices: boolean;\n  hideOneTimePrices: boolean;\n  onSelectPrice: (price: StripePriceInterface) => void;\n  onIntervalChange: (interval: BillingInterval) => void;\n  onNext: () => void;\n  isProcessing: boolean;\n};\n\nexport function WizardStepPlanSelection({\n  selectedPrice,\n  selectedInterval,\n  currentPriceId,\n  hideRecurringPrices,\n  hideOneTimePrices,\n  onSelectPrice,\n  onIntervalChange,\n  onNext,\n  isProcessing,\n}: WizardStepPlanSelectionProps) {\n  const [products, setProducts] = useState<StripeProductInterface[]>([]);\n  const [loading, setLoading] = useState(true);\n\n  useEffect(() => {\n    const loadProducts = async () => {\n      try {\n        const fetchedProducts = await StripeProductService.listProducts({ active: true });\n        setProducts(fetchedProducts);\n      } catch (error) {\n        console.error(\"[WizardStepPlanSelection] Failed to load products:\", error);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    loadProducts();\n  }, []);\n\n  // Compute available intervals from products\n  const { hasMonthly, hasYearly } = useMemo(() => {\n    let hasMonthly = false;\n    let hasYearly = false;\n\n    for (const product of products) {\n      for (const price of product.stripePrices || []) {\n        if (price.priceType === \"recurring\" && price.recurring?.interval === \"month\") {\n          hasMonthly = true;\n        }\n        if (price.priceType === \"recurring\" && price.recurring?.interval === \"year\") {\n          hasYearly = true;\n        }\n      }\n    }\n\n    return { hasMonthly, hasYearly };\n  }, [products]);\n\n  const handleSelectPrice = (price: StripePriceInterface) => {\n    onSelectPrice(price);\n  };\n\n  return (\n    <div className=\"space-y-6\">\n      {/* Interval Toggle - only show for recurring products */}\n      {!hideRecurringPrices && (\n        <div className=\"flex justify-center\">\n          <IntervalToggle\n            value={selectedInterval}\n            onChange={onIntervalChange}\n            hasMonthly={hasMonthly}\n            hasYearly={hasYearly}\n          />\n        </div>\n      )}\n\n      {/* Product Pricing List */}\n      <ProductPricingList\n        products={products}\n        selectedInterval={selectedInterval}\n        currentPriceId={currentPriceId}\n        selectedPriceId={selectedPrice?.id}\n        loading={loading}\n        hideRecurringPrices={hideRecurringPrices}\n        hideOneTimePrices={hideOneTimePrices}\n        onSelectPrice={handleSelectPrice}\n      />\n\n      {/* Action Buttons */}\n      <div className=\"flex justify-end pt-4 border-t\">\n        <Button onClick={onNext} disabled={!selectedPrice || isProcessing}>\n          {isProcessing ? \"Loading...\" : \"Next: Review\"}\n        </Button>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { AlertCircle } from \"lucide-react\";\nimport { Alert, AlertDescription, Badge, Button } from \"../../../../../shadcnui\";\nimport { SectionHeader } from \"../../../../../components/typography\";\nimport { formatCurrency } from \"../../../components/utils/currency\";\nimport { StripePriceInterface } from \"../../../stripe-price/data/stripe-price.interface\";\nimport { ProrationPreviewInterface } from \"../../../stripe-invoice/data/stripe-invoice.interface\";\nimport { PromotionCodeValidationResult } from \"../../../stripe-promotion-code\";\nimport { PromoCodeInput } from \"../../../stripe-promotion-code/components/PromoCodeInput\";\nimport { StripeSubscriptionInterface } from \"../../data\";\n\ntype WizardStepReviewProps = {\n  selectedPrice: StripePriceInterface | null;\n  subscription?: StripeSubscriptionInterface;\n  prorationPreview: ProrationPreviewInterface | null;\n  hasPaymentMethod: boolean;\n  error: string | null;\n  isProcessing: boolean;\n  onBack: () => void;\n  onAddPaymentMethod: () => void;\n  onConfirm: () => void;\n  // Promotion code props\n  promotionCode: PromotionCodeValidationResult | null;\n  isValidatingPromoCode: boolean;\n  promoCodeError: string | null;\n  onApplyPromoCode: (code: string) => void;\n  onRemovePromoCode: () => void;\n  // Trial upgrade flag\n  isTrialUpgrade: boolean;\n};\n\nexport function WizardStepReview({\n  selectedPrice,\n  subscription,\n  prorationPreview,\n  hasPaymentMethod,\n  error,\n  isProcessing,\n  onBack,\n  onAddPaymentMethod,\n  onConfirm,\n  promotionCode,\n  isValidatingPromoCode,\n  promoCodeError,\n  onApplyPromoCode,\n  onRemovePromoCode,\n  isTrialUpgrade,\n}: WizardStepReviewProps) {\n  if (!selectedPrice) {\n    return (\n      <div className=\"text-center py-8 text-muted-foreground\">No plan selected. Please go back and select a plan.</div>\n    );\n  }\n\n  const isChangingPlan = subscription && subscription.price?.id !== selectedPrice.id;\n\n  const formatInterval = (price: StripePriceInterface) => {\n    if (price.priceType === \"one_time\") return \"one-time\";\n    const interval = price.recurring?.interval || \"month\";\n    return interval === \"year\" ? \"yearly\" : \"monthly\";\n  };\n\n  // Calculate discounted price if promotion code is applied\n  const calculateDiscountedPrice = (): number | null => {\n    if (!promotionCode?.valid || !selectedPrice.unitAmount) return null;\n\n    const originalPrice = selectedPrice.unitAmount;\n\n    if (promotionCode.discountType === \"percent_off\" && promotionCode.discountValue) {\n      return originalPrice * (1 - promotionCode.discountValue / 100);\n    }\n\n    if (promotionCode.discountType === \"amount_off\" && promotionCode.discountValue) {\n      // amount_off is in cents, same as unitAmount\n      return Math.max(0, originalPrice - promotionCode.discountValue);\n    }\n\n    return null;\n  };\n\n  const discountedPrice = calculateDiscountedPrice();\n\n  // Calculate discounted immediate charge for proration preview\n  const calculateDiscountedImmediateCharge = (): number | null => {\n    if (!promotionCode?.valid || !prorationPreview?.immediateCharge) return null;\n\n    const originalCharge = prorationPreview.immediateCharge;\n\n    if (promotionCode.discountType === \"percent_off\" && promotionCode.discountValue) {\n      return originalCharge * (1 - promotionCode.discountValue / 100);\n    }\n\n    if (promotionCode.discountType === \"amount_off\" && promotionCode.discountValue) {\n      return Math.max(0, originalCharge - promotionCode.discountValue);\n    }\n\n    return null;\n  };\n\n  const discountedImmediateCharge = calculateDiscountedImmediateCharge();\n\n  // Format the discount description\n  const getDiscountDescription = (): string | null => {\n    if (!promotionCode?.valid) return null;\n\n    if (promotionCode.discountType === \"percent_off\" && promotionCode.discountValue) {\n      return `${promotionCode.discountValue}% off`;\n    }\n\n    if (promotionCode.discountType === \"amount_off\" && promotionCode.discountValue) {\n      return `${formatCurrency(promotionCode.discountValue, promotionCode.currency || selectedPrice.currency)} off`;\n    }\n\n    return null;\n  };\n\n  const discountDescription = getDiscountDescription();\n\n  return (\n    <div className=\"space-y-6\">\n      {/* Selected Plan Summary */}\n      <div className=\"bg-muted/50 rounded-lg p-4 space-y-3\">\n        <SectionHeader>Selected Plan</SectionHeader>\n        <div className=\"flex justify-between items-center\">\n          <div>\n            <p className=\"font-medium\">{selectedPrice.product?.name}</p>\n            {selectedPrice.nickname && <p className=\"text-sm text-muted-foreground\">{selectedPrice.nickname}</p>}\n          </div>\n          <div className=\"text-right\">\n            {discountedPrice !== null ? (\n              <>\n                <p className=\"text-sm text-muted-foreground line-through\">\n                  {formatCurrency(selectedPrice.unitAmount || 0, selectedPrice.currency)}\n                </p>\n                <p className=\"text-success text-lg font-semibold\">\n                  {formatCurrency(discountedPrice, selectedPrice.currency)}\n                </p>\n                {discountDescription && <Badge variant=\"softGreen\">{discountDescription}</Badge>}\n              </>\n            ) : (\n              <p className=\"font-semibold text-lg\">\n                {formatCurrency(selectedPrice.unitAmount || 0, selectedPrice.currency)}\n              </p>\n            )}\n            <p className=\"text-sm text-muted-foreground\">{formatInterval(selectedPrice)}</p>\n          </div>\n        </div>\n      </div>\n\n      {/* Proration Preview (for plan changes) */}\n      {isChangingPlan && prorationPreview && (\n        <div\n          className={`${isTrialUpgrade ? \"bg-warning/15 border-warning/30\" : \"bg-primary/10 border-primary/30\"} space-y-2 rounded-lg border p-4`}\n        >\n          <h4 className={`font-medium ${isTrialUpgrade ? \"text-warning\" : \"text-primary\"}`}>\n            {isTrialUpgrade ? \"Trial Upgrade\" : \"Proration Summary\"}\n          </h4>\n          <p className={`text-sm ${isTrialUpgrade ? \"text-warning\" : \"text-foreground\"}`}>\n            {isTrialUpgrade\n              ? \"Your trial will end immediately and you will be charged the full price.\"\n              : \"Your next charge will be adjusted to account for the plan change.\"}\n          </p>\n          <div className=\"flex justify-between text-sm\">\n            <span className={`${isTrialUpgrade ? \"text-warning\" : \"text-muted-foreground\"}`}>\n              {isTrialUpgrade ? \"Amount to charge now:\" : \"Amount due now:\"}\n            </span>\n            <span className={`font-medium ${isTrialUpgrade ? \"text-warning\" : \"text-foreground\"}`}>\n              {discountedImmediateCharge !== null ? (\n                <>\n                  <span className=\"line-through text-muted-foreground mr-2\">\n                    {formatCurrency(prorationPreview.immediateCharge, prorationPreview.currency)}\n                  </span>\n                  <span className=\"text-success\">\n                    {formatCurrency(discountedImmediateCharge, prorationPreview.currency)}\n                  </span>\n                </>\n              ) : (\n                formatCurrency(prorationPreview.immediateCharge, prorationPreview.currency)\n              )}\n            </span>\n          </div>\n        </div>\n      )}\n\n      {/* Promotion Code */}\n      <div className=\"border rounded-lg p-4 space-y-3\">\n        <h4 className=\"font-medium\">Promotion Code</h4>\n        <PromoCodeInput\n          appliedCode={promotionCode}\n          isValidating={isValidatingPromoCode}\n          error={promoCodeError}\n          onApply={onApplyPromoCode}\n          onRemove={onRemovePromoCode}\n          disabled={isProcessing}\n        />\n      </div>\n\n      {/* Payment Method Status */}\n      <div className=\"border rounded-lg p-4\">\n        <div className=\"flex justify-between items-center\">\n          <div>\n            <h4 className=\"font-medium\">Payment Method</h4>\n            <p className=\"text-sm text-muted-foreground\">\n              {hasPaymentMethod ? \"A payment method is on file\" : \"No payment method on file\"}\n            </p>\n          </div>\n          {!hasPaymentMethod && (\n            <Button variant=\"outline\" onClick={onAddPaymentMethod}>\n              Add Payment Method\n            </Button>\n          )}\n        </div>\n      </div>\n\n      {/* Error Display */}\n      {error && (\n        <Alert variant=\"destructive\">\n          <AlertCircle className=\"h-4 w-4\" />\n          <AlertDescription>{error}</AlertDescription>\n        </Alert>\n      )}\n\n      {/* Action Buttons */}\n      <div className=\"flex justify-between pt-4 border-t\">\n        <Button variant=\"outline\" onClick={onBack} disabled={isProcessing}>\n          Back\n        </Button>\n        <Button onClick={hasPaymentMethod ? onConfirm : onAddPaymentMethod} disabled={isProcessing}>\n          {isProcessing\n            ? \"Processing...\"\n            : hasPaymentMethod\n              ? isChangingPlan\n                ? \"Confirm Plan Change\"\n                : \"Subscribe Now\"\n              : \"Add Payment Method\"}\n        </Button>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Check, X, Loader2 } from \"lucide-react\";\nimport { Button, Input } from \"../../../../shadcnui\";\nimport { PromotionCodeValidationResult } from \"../data/stripe-promotion-code.interface\";\n\ntype PromoCodeInputProps = {\n  appliedCode: PromotionCodeValidationResult | null;\n  isValidating: boolean;\n  error: string | null;\n  onApply: (code: string) => void;\n  onRemove: () => void;\n  disabled?: boolean;\n};\n\nexport function PromoCodeInput({\n  appliedCode,\n  isValidating,\n  error,\n  onApply,\n  onRemove,\n  disabled = false,\n}: PromoCodeInputProps) {\n  const [code, setCode] = useState(\"\");\n\n  const handleApply = () => {\n    if (code.trim()) {\n      onApply(code.trim().toUpperCase());\n    }\n  };\n\n  const handleKeyDown = (e: React.KeyboardEvent) => {\n    if (e.key === \"Enter\") {\n      e.preventDefault();\n      handleApply();\n    }\n  };\n\n  // Format discount for display\n  const formatDiscount = (result: PromotionCodeValidationResult): string => {\n    if (result.discountType === \"percent_off\") {\n      return `${result.discountValue}% off`;\n    }\n    // amount_off is in cents, convert to dollars\n    const amount = (result.discountValue || 0) / 100;\n    const currency = result.currency?.toUpperCase() || \"USD\";\n    return `${currency} ${amount.toFixed(2)} off`;\n  };\n\n  // Format duration for display\n  const formatDuration = (result: PromotionCodeValidationResult): string => {\n    switch (result.duration) {\n      case \"forever\":\n        return \"Applied to all payments\";\n      case \"once\":\n        return \"Applied to first payment only\";\n      case \"repeating\":\n        return `Applied for ${result.durationInMonths} months`;\n      default:\n        return \"\";\n    }\n  };\n\n  // Show applied code state\n  if (appliedCode?.valid) {\n    return (\n      <div className=\"space-y-2\">\n        <div className=\"bg-success/15 border-success/30 flex items-center justify-between rounded-lg border p-3\">\n          <div className=\"flex items-center gap-2\">\n            <Check className=\"text-success h-4 w-4\" />\n            <span className=\"text-success font-medium\">{appliedCode.code}</span>\n            <span className=\"text-success text-sm\">{formatDiscount(appliedCode)}</span>\n          </div>\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            onClick={onRemove}\n            disabled={disabled}\n            className=\"text-success hover:bg-success/25 hover:text-success\"\n          >\n            <X className=\"h-4 w-4\" />\n          </Button>\n        </div>\n        <p className=\"text-success text-sm\">{formatDuration(appliedCode)}</p>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"space-y-2\">\n      <div className=\"flex gap-2\">\n        <Input\n          placeholder=\"Enter promo code\"\n          value={code}\n          onChange={(e) => setCode(e.target.value.toUpperCase())}\n          onKeyDown={handleKeyDown}\n          disabled={disabled || isValidating}\n          className=\"flex-1\"\n        />\n        <Button variant=\"outline\" onClick={handleApply} disabled={disabled || isValidating || !code.trim()}>\n          {isValidating ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : \"Apply\"}\n        </Button>\n      </div>\n      {error && <p className=\"text-destructive text-xs/relaxed\">{error}</p>}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { PaymentMethodForm } from \"../../../stripe-customer/components/forms/PaymentMethodForm\";\nimport { SectionHeader } from \"../../../../../components/typography\";\n\ntype WizardStepPaymentMethodProps = {\n  onBack: () => void;\n  onSuccess: () => void;\n  isProcessing: boolean;\n};\n\nexport function WizardStepPaymentMethod({ onBack, onSuccess, isProcessing }: WizardStepPaymentMethodProps) {\n  return (\n    <div className=\"space-y-6\">\n      <div className=\"text-center\">\n        <SectionHeader>Add Payment Method</SectionHeader>\n        <p className=\"text-sm text-muted-foreground\">Enter your card details to complete your subscription</p>\n      </div>\n\n      <PaymentMethodForm onSuccess={onSuccess} onCancel={onBack} isLoading={isProcessing} />\n    </div>\n  );\n}\n","\"use client\";\n\nimport { Activity } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { StripeSubscriptionInterface, StripeSubscriptionService } from \"../../../stripe-subscription\";\nimport { MeterInterface, MeterSummaryInterface } from \"../../data/stripe-usage.interface\";\nimport { StripeUsageService } from \"../../data/stripe-usage.service\";\nimport { UsageSummaryCards } from \"../widgets/UsageSummaryCards\";\n\nexport function UsageContainer() {\n  const [meters, setMeters] = useState<MeterInterface[]>([]);\n  const [summaries, setSummaries] = useState<Record<string, MeterSummaryInterface | null>>({});\n  const [loading, setLoading] = useState<boolean>(true);\n  const [subscriptions, setSubscriptions] = useState<StripeSubscriptionInterface[]>([]);\n\n  useEffect(() => {\n    loadUsageData();\n  }, []);\n\n  const loadUsageData = async () => {\n    setLoading(true);\n\n    try {\n      // First, check if there are any metered subscriptions\n      const fetchedSubscriptions = await StripeSubscriptionService.listSubscriptions();\n      setSubscriptions(fetchedSubscriptions);\n\n      const hasMeteredSubscriptions = fetchedSubscriptions.some((sub) => sub.price?.recurring?.usageType === \"metered\");\n\n      if (!hasMeteredSubscriptions) {\n        setLoading(false);\n        return;\n      }\n\n      // Load meters\n      const fetchedMeters = await StripeUsageService.listMeters();\n      setMeters(fetchedMeters);\n\n      // Load summaries for each meter (current month)\n      const summariesMap: Record<string, MeterSummaryInterface | null> = {};\n      const now = new Date();\n      const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n      const endOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59, 999);\n\n      for (const meter of fetchedMeters) {\n        try {\n          const meterSummaries = await StripeUsageService.getMeterSummaries({\n            meterId: meter.id,\n            startTime: startOfMonth,\n            endTime: endOfMonth,\n          });\n          // Use the first (most recent) summary\n          summariesMap[meter.id] = meterSummaries.length > 0 ? meterSummaries[0] : null;\n        } catch (error) {\n          console.error(`[UsageContainer] Failed to load summaries for meter ${meter.id}:`, error);\n          summariesMap[meter.id] = null;\n        }\n      }\n\n      setSummaries(summariesMap);\n    } catch (error) {\n      console.error(\"[UsageContainer] Failed to load usage data:\", error);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  // Check if there are any metered subscriptions\n  const hasMeteredSubscriptions = subscriptions.some((sub) => sub.price?.recurring?.usageType === \"metered\");\n\n  // Don't render if no metered subscriptions\n  if (!loading && !hasMeteredSubscriptions) {\n    return null;\n  }\n\n  if (loading) {\n    return (\n      <div className=\"flex h-64 items-center justify-center\">\n        <p className=\"text-muted-foreground\">Loading usage data...</p>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"flex w-full flex-col gap-y-6\">\n      {/* Header */}\n      <div className=\"flex items-center gap-x-3\">\n        <Activity className=\"h-8 w-8\" />\n        <h1 className=\"text-primary text-3xl font-semibold\">Usage Tracking</h1>\n      </div>\n\n      {/* Empty State */}\n      {meters.length === 0 && (\n        <div className=\"bg-muted/50 flex flex-col items-center justify-center gap-y-4 rounded-lg border-2 border-dashed border-gray-300 p-12\">\n          <Activity className=\"text-muted-foreground h-16 w-16\" />\n          <div className=\"text-center\">\n            <h3 className=\"mb-2 text-sm font-medium\">No usage meters configured</h3>\n            <p className=\"text-muted-foreground\">\n              Usage tracking will appear here when you have metered subscriptions with configured meters.\n            </p>\n          </div>\n        </div>\n      )}\n\n      {/* Usage Summary Cards */}\n      {meters.length > 0 && <UsageSummaryCards meters={meters} summaries={summaries} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { Activity } from \"lucide-react\";\nimport { Card, CardContent, CardHeader } from \"../../../../../shadcnui\";\nimport { MeterInterface, MeterSummaryInterface } from \"../../data/stripe-usage.interface\";\n\ntype UsageSummaryCardProps = {\n  meter: MeterInterface;\n  summary: MeterSummaryInterface | null;\n};\n\n/**\n * Get progress bar color based on usage percentage\n */\nfunction getProgressColor(percentage: number | null): string {\n  if (percentage === null) return \"bg-blue-500\";\n  if (percentage >= 90) return \"bg-red-500\";\n  if (percentage >= 75) return \"bg-orange-500\";\n  return \"bg-green-500\";\n}\n\n/**\n * Format a Unix timestamp to readable date\n */\nfunction formatDate(date: Date | undefined): string {\n  if (!date) return \"N/A\";\n\n  try {\n    return new Intl.DateTimeFormat(\"en-US\", {\n      month: \"short\",\n      day: \"numeric\",\n    }).format(new Date(date));\n  } catch (_error) {\n    return \"Invalid Date\";\n  }\n}\n\nexport function UsageSummaryCard({ meter, summary }: UsageSummaryCardProps) {\n  const currentUsage = summary?.aggregatedValue ?? 0;\n  const limit = (meter as any).limit; // Meters may have optional limit field\n  const percentage = limit && limit > 0 ? (currentUsage / limit) * 100 : null;\n  const progressColor = getProgressColor(percentage);\n  const progressWidth = percentage !== null ? Math.min(percentage, 100) : 0;\n\n  const displayName = meter.displayName || meter.eventName;\n  const hasLimit = limit !== null && limit !== undefined;\n\n  return (\n    <Card>\n      <CardHeader className=\"flex flex-row items-center gap-x-3 pb-3\">\n        <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-100 text-blue-600\">\n          <Activity className=\"h-5 w-5\" />\n        </div>\n        <div className=\"flex flex-col\">\n          <h3 className=\"text-sm font-medium\">{displayName}</h3>\n          <p className=\"text-muted-foreground text-xs\">{meter.id}</p>\n        </div>\n      </CardHeader>\n\n      <CardContent className=\"flex flex-col gap-y-4\">\n        {/* Current Usage */}\n        <div>\n          <p className=\"text-3xl font-bold\">{currentUsage.toLocaleString()}</p>\n          {hasLimit && <p className=\"text-muted-foreground text-sm\">of {limit.toLocaleString()} used</p>}\n        </div>\n\n        {/* Progress Bar */}\n        {hasLimit ? (\n          <div className=\"flex flex-col gap-y-2\">\n            <div className=\"h-2 w-full overflow-hidden rounded-full bg-gray-200\">\n              <div className={`h-full transition-all ${progressColor}`} style={{ width: `${progressWidth}%` }} />\n            </div>\n            <p className=\"text-muted-foreground text-sm\">{percentage?.toFixed(1)}% used</p>\n          </div>\n        ) : (\n          <p className=\"text-muted-foreground text-sm\">No limit set</p>\n        )}\n\n        {/* Period Information */}\n        {summary && summary.start && summary.end && (\n          <div className=\"border-t pt-3\">\n            <p className=\"text-muted-foreground text-xs\">\n              Period: {formatDate(summary.start)} - {formatDate(summary.end)}\n            </p>\n          </div>\n        )}\n      </CardContent>\n    </Card>\n  );\n}\n","\"use client\";\n\nimport { MeterInterface, MeterSummaryInterface } from \"../../data/stripe-usage.interface\";\nimport { UsageSummaryCard } from \"../details/UsageSummaryCard\";\n\ntype UsageSummaryCardsProps = {\n  meters: MeterInterface[];\n  summaries: Record<string, MeterSummaryInterface | null>;\n};\n\nexport function UsageSummaryCards({ meters, summaries }: UsageSummaryCardsProps) {\n  return (\n    <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3\">\n      {meters.map((meter) => (\n        <UsageSummaryCard key={meter.id} meter={meter} summary={summaries[meter.id] || null} />\n      ))}\n    </div>\n  );\n}\n","\"use client\";\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../../../../../shadcnui\";\nimport { SectionHeader } from \"../../../../../components/typography\";\nimport { StripeUsageInterface } from \"../../data/stripe-usage.interface\";\n\ntype UsageHistoryTableProps = {\n  usageRecords: StripeUsageInterface[];\n};\n\n/**\n * Format a date with time for usage history\n */\nfunction formatDateTime(date: Date | string | undefined): string {\n  if (!date) return \"N/A\";\n\n  const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n  try {\n    return new Intl.DateTimeFormat(\"en-US\", {\n      month: \"short\",\n      day: \"numeric\",\n      year: \"numeric\",\n      hour: \"numeric\",\n      minute: \"2-digit\",\n    }).format(dateObj);\n  } catch (_error) {\n    return \"Invalid Date\";\n  }\n}\n\nexport function UsageHistoryTable({ usageRecords }: UsageHistoryTableProps) {\n  if (usageRecords.length === 0) {\n    return (\n      <div className=\"rounded-lg border p-8 text-center\">\n        <p className=\"text-muted-foreground\">No usage history available.</p>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"flex w-full flex-col gap-y-4\">\n      <SectionHeader level={2}>Usage History</SectionHeader>\n      <div className=\"overflow-clip rounded-lg border\">\n        <Table>\n          <TableHeader className=\"bg-muted\">\n            <TableRow>\n              <TableHead>Date & Time</TableHead>\n              <TableHead>Meter Event</TableHead>\n              <TableHead className=\"text-right\">Quantity</TableHead>\n              <TableHead>Event ID</TableHead>\n            </TableRow>\n          </TableHeader>\n          <TableBody>\n            {usageRecords.map((record) => {\n              const dateTime = formatDateTime(record.timestamp);\n              const quantity = record.quantity.toLocaleString();\n\n              return (\n                <TableRow key={record.id}>\n                  <TableCell className=\"font-medium\">{dateTime}</TableCell>\n                  <TableCell className=\"text-muted-foreground\">{record.meterEventName}</TableCell>\n                  <TableCell className=\"text-right font-medium\">{quantity}</TableCell>\n                  <TableCell className=\"text-muted-foreground text-sm tabular-nums\">{record.stripeEventId}</TableCell>\n                </TableRow>\n              );\n            })}\n          </TableBody>\n        </Table>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { ReactNode } from \"react\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"../../../../shadcnui\";\n\ntype BillingDetailModalProps = {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  title: string;\n  children: ReactNode;\n  className?: string;\n};\n\nexport function BillingDetailModal({ open, onOpenChange, title, children, className }: BillingDetailModalProps) {\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className={className ?? \"max-w-4xl max-h-[90vh] overflow-y-auto\"}>\n        <DialogHeader>\n          <DialogTitle>{title}</DialogTitle>\n        </DialogHeader>\n        {children}\n      </DialogContent>\n    </Dialog>\n  );\n}\n","\"use client\";\n\nimport { AlertCircle } from \"lucide-react\";\nimport { Button } from \"../../../../shadcnui\";\nimport { StripeSubscriptionInterface, SubscriptionStatus } from \"../../stripe-subscription\";\n\ntype BillingAlertBannerProps = {\n  subscription: StripeSubscriptionInterface;\n  onUpdatePayment?: () => void;\n  onAddPayment?: () => void;\n};\n\nexport function BillingAlertBanner({ subscription, onUpdatePayment, onAddPayment }: BillingAlertBannerProps) {\n  // Payment failed alert (past_due)\n  if (subscription.status === SubscriptionStatus.PAST_DUE) {\n    return (\n      <div className=\"bg-red-50 border border-red-200 rounded-lg p-4 flex items-start gap-x-3\">\n        <AlertCircle className=\"text-destructive mt-0.5 h-5 w-5\" />\n        <div className=\"flex-1\">\n          <h3 className=\"text-destructive text-sm font-medium\">Payment Failed</h3>\n          <p className=\"text-destructive mt-1 text-sm\">\n            Your last payment failed. Please update your payment method to avoid service interruption.\n          </p>\n        </div>\n        {onUpdatePayment && (\n          <Button variant=\"outline\" size=\"sm\" onClick={onUpdatePayment} className=\"text-destructive border-red-300\">\n            Update Payment Method\n          </Button>\n        )}\n      </div>\n    );\n  }\n\n  // Trial ending soon alert (trialing with ≤7 days remaining)\n  if (subscription.status === SubscriptionStatus.TRIALING && subscription.trialEnd) {\n    const trialEnd = new Date(subscription.trialEnd);\n    const now = new Date();\n    const daysRemaining = Math.ceil((trialEnd.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n\n    if (daysRemaining <= 7) {\n      return (\n        <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4 flex items-start gap-x-3\">\n          <AlertCircle className=\"text-warning mt-0.5 h-5 w-5\" />\n          <div className=\"flex-1\">\n            <h3 className=\"text-warning text-sm font-medium\">Trial Ending Soon</h3>\n            <p className=\"text-warning mt-1 text-sm\">\n              Your trial ends in {daysRemaining} {daysRemaining === 1 ? \"day\" : \"days\"}. Add a payment method to\n              continue your subscription.\n            </p>\n          </div>\n          {onAddPayment && (\n            <Button variant=\"outline\" size=\"sm\" onClick={onAddPayment} className=\"text-warning border-yellow-300\">\n              Add Payment Method\n            </Button>\n          )}\n        </div>\n      );\n    }\n  }\n\n  // No critical state\n  return null;\n}\n","\"use client\";\n\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport { loadStripe, Stripe } from \"@stripe/stripe-js\";\nimport { ReactNode, useMemo } from \"react\";\nimport { getStripePublishableKey } from \"../../../../client/config\";\n\n// Cache the stripe promise to avoid recreating on each render\nlet stripePromiseCache: { key: string; promise: Promise<Stripe | null> } | null = null;\n\nfunction getStripePromise(publishableKey: string | undefined): Promise<Stripe | null> {\n  if (!publishableKey) {\n    return Promise.resolve(null);\n  }\n\n  // Return cached promise if key matches\n  if (stripePromiseCache?.key === publishableKey) {\n    return stripePromiseCache.promise;\n  }\n\n  // Create and cache new promise\n  const promise = loadStripe(publishableKey);\n  stripePromiseCache = { key: publishableKey, promise };\n  return promise;\n}\n\nexport function StripeProvider({ children }: { children: ReactNode }) {\n  // Evaluate key at render time, not module load time\n  const publishableKey = getStripePublishableKey();\n  const stripePromise = useMemo(() => getStripePromise(publishableKey), [publishableKey]);\n  const options = useMemo(() => ({}), []);\n\n  // If no Stripe key is configured, just render children without Stripe context\n  if (!publishableKey) {\n    return <>{children}</>;\n  }\n\n  return (\n    <Elements stripe={stripePromise} options={options}>\n      {children}\n    </Elements>\n  );\n}\n\n// Helper function to check if Stripe is configured\nexport function isStripeConfigured(): boolean {\n  return !!getStripePublishableKey();\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { createContext, ReactNode, useCallback, useContext, useMemo, useState } from \"react\";\nimport { SharedProvider } from \"../../../contexts/SharedContext\";\nimport { JsonApiHydratedDataInterface, Modules, rehydrate } from \"../../../core\";\nimport { usePageUrlGenerator } from \"../../../hooks\";\nimport { BreadcrumbItemData } from \"../../../interfaces\";\nimport { getRoleId } from \"../../../roles\";\nimport { useCurrentUserContext } from \"../../user/contexts\";\nimport { formatCurrency, formatInterval } from \"../components/utils/currency\";\nimport { PriceArchiver } from \"../stripe-price/components/forms/PriceArchiver\";\nimport PriceEditor from \"../stripe-price/components/forms/PriceEditor\";\nimport { StripePriceInput, StripePriceInterface } from \"../stripe-price/data/stripe-price.interface\";\nimport { StripePriceService } from \"../stripe-price/data/stripe-price.service\";\n\nexport interface PriceContextType {\n  price: StripePriceInterface | undefined;\n  setPrice: (value: StripePriceInterface | undefined) => void;\n  reloadPrice: () => Promise<void>;\n  createPrice: (input: StripePriceInput) => Promise<StripePriceInterface>;\n  updatePrice: (input: StripePriceInput) => Promise<StripePriceInterface>;\n  archivePrice: (id?: string) => Promise<void>;\n  restorePrice: (id?: string) => Promise<void>;\n  /** Bumped by every mutation. Mounted lists re-fetch on it. */\n  priceVersion: number;\n  refreshPrices: () => void;\n  /** Product a newly created price attaches to. Set in list mode (prices tab). */\n  productId: string | undefined;\n}\n\nconst PriceContext = createContext<PriceContextType | undefined>(undefined);\n\nexport type PriceProviderProps = {\n  children: ReactNode;\n  dehydratedPrice?: JsonApiHydratedDataInterface;\n  /**\n   * Publish breadcrumbs + title into SharedProvider. Pass `false` when this\n   * provider is mounted INSIDE another entity's page (the prices tab mounts\n   * PriceProvider that way): SharedProvider replaces its value for the subtree\n   * rather than merging (SharedContext.tsx:35-37), so a nested provider that\n   * publishes chrome would blank the host page's title.\n   */\n  publishChrome?: boolean;\n  /** Required in list mode (the prices tab) so new prices attach to the right product. */\n  productId?: string;\n};\n\nconst defaultContextValue: PriceContextType = {\n  price: undefined,\n  setPrice: () => {},\n  reloadPrice: async () => {},\n  createPrice: async () => {\n    throw new Error(\"createPrice requires a PriceProvider\");\n  },\n  updatePrice: async () => {\n    throw new Error(\"updatePrice requires a PriceProvider\");\n  },\n  archivePrice: async () => {},\n  restorePrice: async () => {},\n  priceVersion: 0,\n  refreshPrices: () => {},\n  productId: undefined,\n};\n\n/** Human label for a price: its nickname, else amount + interval. */\nexport function priceLabel(price: StripePriceInterface): string {\n  return price.nickname ?? `${formatCurrency(price.unitAmount, price.currency)} ${formatInterval(price)}`.trim();\n}\n\nexport const PriceProvider = ({\n  children,\n  dehydratedPrice,\n  publishChrome = true,\n  productId: productIdProp,\n}: PriceProviderProps) => {\n  const t = useTranslations();\n  const generateUrl = usePageUrlGenerator();\n  const { hasRole } = useCurrentUserContext();\n\n  const [price, setPrice] = useState<StripePriceInterface | undefined>(\n    dehydratedPrice ? rehydrate<StripePriceInterface>(Modules.StripePrice, dehydratedPrice) : undefined,\n  );\n  const [priceVersion, setPriceVersion] = useState<number>(0);\n\n  const refreshPrices = useCallback(() => setPriceVersion((value) => value + 1), []);\n\n  // NOT `price.productId`: that getter throws (\"productId is not defined\") when\n  // the attribute is absent, and it always is — the API's mapStripePrice sets\n  // `stripeProduct: undefined`, and the serialiser derives the productId\n  // attribute from exactly that field, so a price never carries one over the\n  // wire. Reading it here crashed the whole price page on mount. Fall back to\n  // the hydrated relationship, which is a safe optional getter.\n  const productId = productIdProp ?? price?.product?.id;\n\n  const reloadPrice = useCallback(async () => {\n    if (!price?.id) return;\n    setPrice(await StripePriceService.getPrice({ id: price.id }));\n  }, [price?.id]);\n\n  const createPrice = useCallback(\n    async (input: StripePriceInput) => {\n      const saved = await StripePriceService.createPrice(input);\n      refreshPrices();\n      return saved;\n    },\n    [refreshPrices],\n  );\n\n  const updatePrice = useCallback(\n    async (input: StripePriceInput) => {\n      const saved = await StripePriceService.updatePrice(input);\n      setPrice(saved);\n      refreshPrices();\n      return saved;\n    },\n    [refreshPrices],\n  );\n\n  // The archive/reactivate routes answer 204 NO_CONTENT with an empty body\n  // (stripe-price.controller.ts:129-155) even though the service signature\n  // claims it returns void — so the response is discarded and the entity is\n  // re-read instead.\n  const archivePrice = useCallback(\n    async (id?: string) => {\n      const target = id ?? price?.id;\n      if (!target) return;\n      await StripePriceService.archivePrice({ id: target });\n      await reloadPrice();\n      refreshPrices();\n    },\n    [price?.id, reloadPrice, refreshPrices],\n  );\n\n  const restorePrice = useCallback(\n    async (id?: string) => {\n      const target = id ?? price?.id;\n      if (!target) return;\n      await StripePriceService.reactivatePrice({ id: target });\n      await reloadPrice();\n      refreshPrices();\n    },\n    [price?.id, reloadPrice, refreshPrices],\n  );\n\n  const value = useMemo<PriceContextType>(\n    () => ({\n      price,\n      setPrice,\n      reloadPrice,\n      createPrice,\n      updatePrice,\n      archivePrice,\n      restorePrice,\n      priceVersion,\n      refreshPrices,\n      productId,\n    }),\n    [price, reloadPrice, createPrice, updatePrice, archivePrice, restorePrice, priceVersion, refreshPrices, productId],\n  );\n\n  if (!publishChrome) return <PriceContext.Provider value={value}>{children}</PriceContext.Provider>;\n\n  const breadcrumb = (): BreadcrumbItemData[] => {\n    const items: BreadcrumbItemData[] = [\n      { name: t(\"billing.admin.products.title\"), href: generateUrl({ page: Modules.StripeProduct }) },\n    ];\n    if (price?.product)\n      items.push({\n        name: price.product.name,\n        href: generateUrl({ page: Modules.StripeProduct, id: price.product.id }),\n      });\n    if (price) items.push({ name: priceLabel(price) });\n    return items;\n  };\n\n  const title = () => {\n    const response: any = { type: t(\"billing.admin.prices.title\") };\n    if (!price) return response;\n\n    response.element = priceLabel(price);\n\n    // narr8 note: gate on hasRole ONLY. hasPermissionToModule always returns\n    // false in this app, so gating an editor on it hides the editor outright.\n    if (hasRole(getRoleId().Administrator)) {\n      response.functions = [\n        <PriceArchiver key=\"priceArchiver\" price={price} />,\n        <PriceEditor key=\"priceEditor\" price={price} propagateChanges={setPrice} />,\n      ];\n    }\n\n    return response;\n  };\n\n  return (\n    <SharedProvider value={{ breadcrumbs: breadcrumb(), title: title() }}>\n      <PriceContext.Provider value={value}>{children}</PriceContext.Provider>\n    </SharedProvider>\n  );\n};\n\nexport const usePriceContext = (): PriceContextType => useContext(PriceContext) ?? defaultContextValue;\n","\"use client\";\n\nimport { ArchiveIcon, RotateCcwIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { useState } from \"react\";\nimport { errorToast } from \"../../../../../components/errors\";\nimport { Button, ConfirmDialog } from \"../../../../../shadcnui\";\nimport { priceLabel, usePriceContext } from \"../../../contexts/PriceContext\";\nimport { StripePriceInterface } from \"../../data/stripe-price.interface\";\n\ntype PriceArchiverProps = {\n  price: StripePriceInterface;\n};\n\n/**\n * Archive / restore control for a price. Built on ConfirmDialog, which is\n * controlled and trigger-less by design — the caller owns the trigger button,\n * so none of Base UI's trigger-composition pitfalls apply (no asChild, no\n * nested <button>).\n */\nexport function PriceArchiver({ price }: PriceArchiverProps) {\n  const t = useTranslations();\n  const { archivePrice, restorePrice } = usePriceContext();\n  const [open, setOpen] = useState<boolean>(false);\n\n  const isArchived = !price.active;\n  const scope = isArchived ? \"restore\" : \"archive\";\n\n  return (\n    <>\n      <Button variant=\"outline\" size=\"sm\" onClick={() => setOpen(true)}>\n        {isArchived ? <RotateCcwIcon /> : <ArchiveIcon />}\n        {t(`billing.admin.prices.${scope}.confirm`)}\n      </Button>\n      <ConfirmDialog\n        open={open}\n        onOpenChange={setOpen}\n        title={t(`billing.admin.prices.${scope}.title`)}\n        description={t(`billing.admin.prices.${scope}.description`, { label: priceLabel(price) })}\n        confirmLabel={t(`billing.admin.prices.${scope}.confirm`)}\n        cancelLabel={t(\"ui.buttons.cancel\")}\n        destructive={!isArchived}\n        onConfirm={async () => {\n          try {\n            if (isArchived) await restorePrice(price.id);\n            else await archivePrice(price.id);\n          } catch (error) {\n            errorToast({ title: t(`billing.admin.prices.${scope}.title`), error });\n            throw error; // keeps the dialog open — ConfirmDialog swallows rejections\n          }\n        }}\n      />\n    </>\n  );\n}\n","\"use client\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { PlusIcon, XIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { ReactNode, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { v4 } from \"uuid\";\nimport { z } from \"zod\";\nimport { EditorSheet, FieldLabel, FormCheckbox, FormInput, FormSelect, FormTextarea } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { useI18nRouter } from \"../../../../../i18n\";\nimport { Alert, AlertDescription, AlertTitle, Button, Checkbox, Input } from \"../../../../../shadcnui\";\nimport { FeatureInterface, FeatureService } from \"../../../../feature\";\nimport { priceLabel, usePriceContext } from \"../../../contexts/PriceContext\";\nimport { StripePriceInput, StripePriceInterface } from \"../../data/stripe-price.interface\";\n\nexport type PriceEditorProps = {\n  productId?: string;\n  price?: StripePriceInterface;\n  propagateChanges?: (price: StripePriceInterface) => void;\n  onSuccess?: () => void | Promise<void>;\n  trigger?: ReactNode;\n  forceShow?: boolean;\n  onClose?: () => void;\n  dialogOpen?: boolean;\n  onDialogOpenChange?: (open: boolean) => void;\n};\n\nfunction PriceEditorInternal({\n  productId,\n  price,\n  propagateChanges,\n  onSuccess,\n  trigger,\n  forceShow,\n  onClose,\n  dialogOpen,\n  onDialogOpenChange,\n}: PriceEditorProps) {\n  const t = useTranslations();\n  const router = useI18nRouter();\n  const { createPrice, updatePrice, productId: contextProductId } = usePriceContext();\n  const [allFeatures, setAllFeatures] = useState<FeatureInterface[]>([]);\n  const isEdit = !!price;\n  // NOT `price.productId` — that getter throws when the attribute is absent, and\n  // it always is (see the note in PriceContext). Only create mode needs this,\n  // and there it arrives as a prop or from the context.\n  const targetProductId = productId ?? price?.product?.id ?? contextProductId;\n\n  useEffect(() => {\n    const fetchFeatures = async () => {\n      setAllFeatures(await FeatureService.findMany({}));\n    };\n    void fetchFeatures();\n  }, []);\n\n  const formSchema = useMemo(\n    () =>\n      z.object({\n        unitAmount: z.preprocess(\n          (value) => (typeof value === \"string\" ? parseFloat(value) : value),\n          z.number().min(0, { message: t(\"billing.admin.prices.errors.amount\") }),\n        ),\n        currency: z.string().min(1, { message: t(\"billing.admin.prices.errors.currency\") }),\n        interval: z.enum([\"one_time\", \"day\", \"week\", \"month\", \"year\"]),\n        intervalCount: z.preprocess(\n          (value) =>\n            value === \"\" || value === undefined ? undefined : typeof value === \"string\" ? parseInt(value, 10) : value,\n          z.number().min(1).optional(),\n        ),\n        usageType: z.enum([\"licensed\", \"metered\"]).optional(),\n        nickname: z.string().optional(),\n        isTrial: z.boolean(),\n        description: z.string().optional(),\n        features: z.array(z.string()),\n        // Normalised, not a bare `z.string()`: the field renders as\n        // `<FormInput type=\"number\">`, which hands back a number, so a plain\n        // string schema rejects every value with \"expected string, received\n        // number\".\n        //\n        // Normalised by hand rather than with `z.coerce.string()`, because\n        // zod 4's coercion is `String(input)` — a cleared number input yields\n        // NaN, which would become the TRUTHY string \"NaN\" and reach\n        // `parseInt` as a NaN token.\n        //\n        // Deliberately NOT converted to the `z.preprocess(... z.number())`\n        // idiom used by unitAmount/intervalCount above. The whole token\n        // pipeline is string-based — seeded with `.toString()` and read back\n        // with `values.token ? parseInt(...)` on both submit branches — and a\n        // number pipeline would make `0` FALSY, silently dropping the token\n        // from the payload. A price with no token is \"tokens not configured\"\n        // (AI stays enabled), so that would make a zero-token / no-AI plan\n        // impossible to create from this form.\n        token: z.preprocess(\n          (value) =>\n            value === undefined || value === null || value === \"\" || (typeof value === \"number\" && Number.isNaN(value))\n              ? \"\"\n              : String(value),\n          z.string(),\n        ),\n        featureIds: z.array(z.string()),\n      }),\n    [t],\n  );\n\n  type PriceFormValues = z.infer<typeof formSchema>;\n\n  // Fed to BOTH useForm and EditorSheet.onReset. The previous implementation\n  // reseeded with its own `useEffect(… form.reset)` on open; EditorSheet already\n  // owns that (EditorSheet.tsx:163-190) and running both fights over the form.\n  //\n  // `active` is absent on purpose: archiving is the single deactivation path\n  // (PriceArchiver), and a second toggle here would let the two disagree.\n  const getDefaultValues = useCallback((): PriceFormValues => {\n    const coreFeatureIds = allFeatures.filter((feature) => feature.isCore).map((feature) => feature.id);\n    return {\n      unitAmount: price?.unitAmount ? price.unitAmount / 100 : 0,\n      currency: price?.currency ?? \"usd\",\n      interval: price?.priceType === \"one_time\" ? \"one_time\" : (price?.recurring?.interval ?? \"month\"),\n      intervalCount: price?.recurring?.intervalCount ?? 1,\n      usageType: price?.recurring?.usageType ?? \"licensed\",\n      nickname: price?.nickname ?? \"\",\n      isTrial: price?.isTrial ?? false,\n      description: price?.description ?? \"\",\n      features: price?.features ?? [],\n      token: price?.token?.toString() ?? \"\",\n      featureIds: [...new Set([...(price?.priceFeatures?.map((f) => f.id) ?? []), ...coreFeatureIds])],\n    };\n  }, [price, allFeatures]);\n\n  const form = useForm<PriceFormValues>({\n    resolver: zodResolver(formSchema) as any,\n    defaultValues: getDefaultValues(),\n  });\n\n  const watchInterval = form.watch(\"interval\");\n  const isRecurring = watchInterval !== \"one_time\";\n\n  const currencyOptions = [\n    { id: \"usd\", text: \"USD ($)\" },\n    { id: \"eur\", text: \"EUR (€)\" },\n    { id: \"gbp\", text: \"GBP (£)\" },\n  ];\n\n  const intervalOptions = [\n    { id: \"one_time\", text: t(\"billing.admin.prices.interval.one_time\") },\n    { id: \"day\", text: t(\"billing.admin.prices.interval.day\") },\n    { id: \"week\", text: t(\"billing.admin.prices.interval.week\") },\n    { id: \"month\", text: t(\"billing.admin.prices.interval.month\") },\n    { id: \"year\", text: t(\"billing.admin.prices.interval.year\") },\n  ];\n\n  const usageTypeOptions = [\n    { id: \"licensed\", text: t(\"billing.admin.prices.usage.licensed\") },\n    { id: \"metered\", text: t(\"billing.admin.prices.usage.metered\") },\n  ];\n\n  return (\n    <EditorSheet\n      form={form}\n      entityType={t(\"billing.admin.prices.entity\")}\n      entityName={price ? priceLabel(price) : undefined}\n      isEdit={isEdit}\n      module={Modules.StripePrice}\n      size=\"lg\"\n      propagateChanges={propagateChanges}\n      onSuccess={onSuccess}\n      onNavigate={(url) => router.push(url)}\n      onSubmit={async (values) => {\n        const trimmedFeatures = values.features.filter((feature) => feature.trim());\n\n        if (isEdit) {\n          const patch: StripePriceInput = {\n            id: price.id,\n            nickname: values.nickname || undefined,\n            description: values.description || undefined,\n            features: trimmedFeatures.length > 0 ? trimmedFeatures : undefined,\n            token: values.token ? parseInt(values.token, 10) : undefined,\n            // Stripe one-time prices carry neither a trial flag nor platform\n            // features, so those two only travel for recurring prices.\n            ...(price.priceType === \"recurring\" ? { isTrial: values.isTrial, featureIds: values.featureIds } : {}),\n          };\n          return await updatePrice(patch);\n        }\n\n        if (!targetProductId) throw new Error(\"PriceEditor requires a productId to create a price\");\n\n        const payload: StripePriceInput = {\n          id: v4(),\n          productId: targetProductId,\n          currency: values.currency,\n          unitAmount: Math.round(values.unitAmount * 100),\n        };\n        if (isRecurring) {\n          payload.recurring = {\n            interval: values.interval as \"day\" | \"week\" | \"month\" | \"year\",\n            intervalCount: values.intervalCount ?? 1,\n            usageType: values.usageType ?? \"licensed\",\n          };\n          payload.isTrial = values.isTrial;\n          if (values.featureIds.length > 0) payload.featureIds = values.featureIds;\n        }\n        if (values.nickname) payload.nickname = values.nickname;\n        if (values.description) payload.description = values.description;\n        if (trimmedFeatures.length > 0) payload.features = trimmedFeatures;\n        if (values.token) payload.token = parseInt(values.token, 10);\n\n        return await createPrice(payload);\n      }}\n      onReset={getDefaultValues}\n      trigger={trigger}\n      forceShow={forceShow}\n      onClose={onClose}\n      dialogOpen={dialogOpen}\n      onDialogOpenChange={onDialogOpenChange}\n    >\n      <div className=\"flex w-full flex-col gap-y-4\">\n        {isEdit && (\n          <Alert>\n            <AlertTitle>{t(\"billing.admin.prices.immutability.title\")}</AlertTitle>\n            <AlertDescription>{t(\"billing.admin.prices.immutability.description\")}</AlertDescription>\n          </Alert>\n        )}\n\n        <div className=\"grid grid-cols-2 gap-x-4\">\n          {/* type=\"decimal\", NOT type=\"currency\": the currency variant hardcodes\n              a Euro symbol (FormInput.tsx:105-106), which contradicts the\n              currency selector sitting next to it. */}\n          <FormInput\n            form={form}\n            id=\"unitAmount\"\n            type=\"decimal\"\n            name={t(\"billing.admin.prices.fields.amount\")}\n            placeholder={t(\"billing.admin.prices.placeholders.amount\")}\n            disabled={isEdit}\n            isRequired\n          />\n          <FormSelect\n            form={form}\n            id=\"currency\"\n            name={t(\"billing.admin.prices.fields.currency\")}\n            values={currencyOptions}\n            disabled={isEdit}\n          />\n        </div>\n\n        <FormSelect\n          form={form}\n          id=\"interval\"\n          name={t(\"billing.admin.prices.fields.interval\")}\n          values={intervalOptions}\n          disabled={isEdit}\n        />\n\n        {isRecurring && (\n          <div className=\"grid grid-cols-2 gap-x-4\">\n            <FormInput\n              form={form}\n              id=\"intervalCount\"\n              type=\"number\"\n              name={t(\"billing.admin.prices.fields.intervalCount\")}\n              placeholder={t(\"billing.admin.prices.placeholders.intervalCount\")}\n              disabled={isEdit}\n            />\n            <FormSelect\n              form={form}\n              id=\"usageType\"\n              name={t(\"billing.admin.prices.fields.usageType\")}\n              values={usageTypeOptions}\n              disabled={isEdit}\n            />\n          </div>\n        )}\n\n        <FormInput\n          form={form}\n          id=\"nickname\"\n          name={t(\"billing.admin.prices.fields.nickname\")}\n          placeholder={t(\"billing.admin.prices.placeholders.nickname\")}\n        />\n\n        <FormTextarea\n          form={form}\n          id=\"description\"\n          name={t(\"billing.admin.prices.fields.description\")}\n          placeholder={t(\"billing.admin.prices.placeholders.description\")}\n          className=\"min-h-24\"\n        />\n\n        <FormInput\n          form={form}\n          id=\"token\"\n          type=\"number\"\n          name={t(\"billing.admin.prices.fields.token\")}\n          placeholder={t(\"billing.admin.prices.placeholders.token\")}\n        />\n\n        <div className=\"flex flex-col gap-y-2\">\n          <FieldLabel>{t(\"billing.admin.prices.fields.features\")}</FieldLabel>\n          {form.watch(\"features\").map((_, index) => (\n            <div key={index} className=\"flex gap-2\">\n              <Input\n                {...form.register(`features.${index}`)}\n                placeholder={t(\"billing.admin.prices.placeholders.feature\", { index: index + 1 })}\n                className=\"flex-1\"\n              />\n              <Button\n                type=\"button\"\n                variant=\"outline\"\n                size=\"icon\"\n                aria-label={t(\"billing.admin.prices.actions.removeFeature\")}\n                onClick={() =>\n                  form.setValue(\n                    \"features\",\n                    form.getValues(\"features\").filter((_, i) => i !== index),\n                  )\n                }\n              >\n                <XIcon />\n              </Button>\n            </div>\n          ))}\n          <Button\n            type=\"button\"\n            variant=\"outline\"\n            size=\"sm\"\n            className=\"self-start\"\n            onClick={() => form.setValue(\"features\", [...form.getValues(\"features\"), \"\"])}\n          >\n            <PlusIcon />\n            {t(\"billing.admin.prices.actions.addFeature\")}\n          </Button>\n        </div>\n\n        {isRecurring && allFeatures.length > 0 && (\n          <div className=\"flex flex-col gap-y-2\">\n            <FieldLabel>{t(\"billing.admin.prices.fields.platformFeatures\")}</FieldLabel>\n            <div className=\"flex max-h-48 flex-col gap-y-2 overflow-y-auto rounded-md border p-4\">\n              {allFeatures.map((feature) => {\n                const isChecked = form.watch(\"featureIds\").includes(feature.id);\n                return (\n                  <div key={feature.id} className=\"flex items-center gap-x-2\">\n                    <Checkbox\n                      id={`feature-${feature.id}`}\n                      checked={isChecked}\n                      disabled={feature.isCore}\n                      onCheckedChange={(checked) => {\n                        const current = form.getValues(\"featureIds\");\n                        if (checked) form.setValue(\"featureIds\", [...new Set([...current, feature.id])]);\n                        else if (!feature.isCore)\n                          form.setValue(\n                            \"featureIds\",\n                            current.filter((id) => id !== feature.id),\n                          );\n                      }}\n                    />\n                    <FieldLabel htmlFor={`feature-${feature.id}`}>{feature.name}</FieldLabel>\n                    {/* Typography role 12 (caption) — token colour, never text-gray-*. */}\n                    {feature.isCore && (\n                      <span className=\"text-muted-foreground text-xs\">{t(\"billing.admin.prices.help.core\")}</span>\n                    )}\n                  </div>\n                );\n              })}\n            </div>\n          </div>\n        )}\n\n        {isRecurring && (\n          <FormCheckbox\n            form={form}\n            id=\"isTrial\"\n            name={t(\"billing.admin.prices.fields.trial\")}\n            description={t(\"billing.admin.prices.help.trial\")}\n          />\n        )}\n      </div>\n    </EditorSheet>\n  );\n}\n\nexport default function PriceEditor(props: PriceEditorProps) {\n  return <PriceEditorInternal {...props} />;\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { createContext, ReactNode, useCallback, useContext, useMemo, useState } from \"react\";\nimport { SharedProvider } from \"../../../contexts/SharedContext\";\nimport { JsonApiHydratedDataInterface, Modules, rehydrate } from \"../../../core\";\nimport { usePageUrlGenerator } from \"../../../hooks\";\nimport { BreadcrumbItemData } from \"../../../interfaces\";\nimport { getRoleId } from \"../../../roles\";\nimport { useCurrentUserContext } from \"../../user/contexts\";\nimport { ProductArchiver } from \"../stripe-product/components/forms/ProductArchiver\";\nimport ProductEditor from \"../stripe-product/components/forms/ProductEditor\";\nimport { StripeProductInput, StripeProductInterface } from \"../stripe-product/data/stripe-product.interface\";\nimport { StripeProductService } from \"../stripe-product/data/stripe-product.service\";\n\nexport interface ProductContextType {\n  product: StripeProductInterface | undefined;\n  setProduct: (value: StripeProductInterface | undefined) => void;\n  reloadProduct: () => Promise<void>;\n  createProduct: (input: StripeProductInput) => Promise<StripeProductInterface>;\n  updateProduct: (input: StripeProductInput) => Promise<StripeProductInterface>;\n  archiveProduct: (id?: string) => Promise<void>;\n  restoreProduct: (id?: string) => Promise<void>;\n  /** Bumped by every mutation. Mounted lists re-fetch on it. */\n  catalogueVersion: number;\n  refreshCatalogue: () => void;\n}\n\nconst ProductContext = createContext<ProductContextType | undefined>(undefined);\n\nexport type ProductProviderProps = {\n  children: ReactNode;\n  dehydratedProduct?: JsonApiHydratedDataInterface;\n  /**\n   * Publish breadcrumbs + title into SharedProvider. Pass `false` when this\n   * provider is mounted INSIDE another entity's page (the prices tab mounts\n   * PriceProvider that way): SharedProvider replaces its value for the subtree\n   * rather than merging (SharedContext.tsx:35-37), so a nested provider that\n   * publishes chrome would blank the host page's title.\n   */\n  publishChrome?: boolean;\n};\n\nconst defaultContextValue: ProductContextType = {\n  product: undefined,\n  setProduct: () => {},\n  reloadProduct: async () => {},\n  createProduct: async () => {\n    throw new Error(\"createProduct requires a ProductProvider\");\n  },\n  updateProduct: async () => {\n    throw new Error(\"updateProduct requires a ProductProvider\");\n  },\n  archiveProduct: async () => {},\n  restoreProduct: async () => {},\n  catalogueVersion: 0,\n  refreshCatalogue: () => {},\n};\n\nexport const ProductProvider = ({ children, dehydratedProduct, publishChrome = true }: ProductProviderProps) => {\n  const t = useTranslations();\n  const generateUrl = usePageUrlGenerator();\n  const { hasRole } = useCurrentUserContext();\n\n  const [product, setProduct] = useState<StripeProductInterface | undefined>(\n    dehydratedProduct ? rehydrate<StripeProductInterface>(Modules.StripeProduct, dehydratedProduct) : undefined,\n  );\n  const [catalogueVersion, setCatalogueVersion] = useState<number>(0);\n\n  const refreshCatalogue = useCallback(() => setCatalogueVersion((value) => value + 1), []);\n\n  const reloadProduct = useCallback(async () => {\n    if (!product?.id) return;\n    setProduct(await StripeProductService.getProduct({ id: product.id }));\n  }, [product?.id]);\n\n  const createProduct = useCallback(\n    async (input: StripeProductInput) => {\n      const saved = await StripeProductService.createProduct(input);\n      refreshCatalogue();\n      return saved;\n    },\n    [refreshCatalogue],\n  );\n\n  const updateProduct = useCallback(\n    async (input: StripeProductInput) => {\n      const saved = await StripeProductService.updateProduct(input);\n      setProduct(saved);\n      refreshCatalogue();\n      return saved;\n    },\n    [refreshCatalogue],\n  );\n\n  // The archive/reactivate routes answer 204 NO_CONTENT with an empty body\n  // (stripe-product.controller.ts:99-115) even though the service signature\n  // claims it returns a product — so the response is discarded and the entity\n  // is re-read instead.\n  const archiveProduct = useCallback(\n    async (id?: string) => {\n      const target = id ?? product?.id;\n      if (!target) return;\n      await StripeProductService.archiveProduct({ id: target });\n      await reloadProduct();\n      refreshCatalogue();\n    },\n    [product?.id, reloadProduct, refreshCatalogue],\n  );\n\n  const restoreProduct = useCallback(\n    async (id?: string) => {\n      const target = id ?? product?.id;\n      if (!target) return;\n      await StripeProductService.reactivateProduct({ id: target });\n      await reloadProduct();\n      refreshCatalogue();\n    },\n    [product?.id, reloadProduct, refreshCatalogue],\n  );\n\n  const value = useMemo<ProductContextType>(\n    () => ({\n      product,\n      setProduct,\n      reloadProduct,\n      createProduct,\n      updateProduct,\n      archiveProduct,\n      restoreProduct,\n      catalogueVersion,\n      refreshCatalogue,\n    }),\n    [\n      product,\n      reloadProduct,\n      createProduct,\n      updateProduct,\n      archiveProduct,\n      restoreProduct,\n      catalogueVersion,\n      refreshCatalogue,\n    ],\n  );\n\n  if (!publishChrome) return <ProductContext.Provider value={value}>{children}</ProductContext.Provider>;\n\n  const breadcrumb = (): BreadcrumbItemData[] => {\n    const items: BreadcrumbItemData[] = [\n      {\n        name: t(\"billing.admin.products.title\"),\n        // Linked only when it is NOT the current page.\n        ...(product ? { href: generateUrl({ page: Modules.StripeProduct }) } : {}),\n      },\n    ];\n    if (product) items.push({ name: product.name });\n    return items;\n  };\n\n  const title = () => {\n    const response: any = { type: t(\"billing.admin.products.title\") };\n    if (!product) return response;\n\n    response.element = product.name;\n\n    // narr8 note: gate on hasRole ONLY. hasPermissionToModule always returns\n    // false in this app, so gating an editor on it hides the editor outright.\n    if (hasRole(getRoleId().Administrator)) {\n      response.functions = [\n        <ProductArchiver key=\"productArchiver\" product={product} />,\n        <ProductEditor key=\"productEditor\" product={product} propagateChanges={setProduct} />,\n      ];\n    }\n\n    return response;\n  };\n\n  return (\n    <SharedProvider value={{ breadcrumbs: breadcrumb(), title: title() }}>\n      <ProductContext.Provider value={value}>{children}</ProductContext.Provider>\n    </SharedProvider>\n  );\n};\n\nexport const useProductContext = (): ProductContextType => useContext(ProductContext) ?? defaultContextValue;\n","\"use client\";\n\nimport { ArchiveIcon, RotateCcwIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { useState } from \"react\";\nimport { errorToast } from \"../../../../../components/errors\";\nimport { Button, ConfirmDialog } from \"../../../../../shadcnui\";\nimport { useProductContext } from \"../../../contexts/ProductContext\";\nimport { StripeProductInterface } from \"../../data/stripe-product.interface\";\n\ntype ProductArchiverProps = {\n  product: StripeProductInterface;\n};\n\n/**\n * Archive / restore control for a product. Built on ConfirmDialog, which is\n * controlled and trigger-less by design — the caller owns the trigger button,\n * so none of Base UI's trigger-composition pitfalls apply (no asChild, no\n * nested <button>).\n */\nexport function ProductArchiver({ product }: ProductArchiverProps) {\n  const t = useTranslations();\n  const { archiveProduct, restoreProduct } = useProductContext();\n  const [open, setOpen] = useState<boolean>(false);\n\n  const isArchived = !product.active;\n  const scope = isArchived ? \"restore\" : \"archive\";\n\n  return (\n    <>\n      <Button variant=\"outline\" size=\"sm\" onClick={() => setOpen(true)}>\n        {isArchived ? <RotateCcwIcon /> : <ArchiveIcon />}\n        {t(`billing.admin.products.${scope}.confirm`)}\n      </Button>\n      <ConfirmDialog\n        open={open}\n        onOpenChange={setOpen}\n        title={t(`billing.admin.products.${scope}.title`)}\n        description={t(`billing.admin.products.${scope}.description`, { name: product.name })}\n        confirmLabel={t(`billing.admin.products.${scope}.confirm`)}\n        cancelLabel={t(\"ui.buttons.cancel\")}\n        destructive={!isArchived}\n        onConfirm={async () => {\n          try {\n            if (isArchived) await restoreProduct(product.id);\n            else await archiveProduct(product.id);\n          } catch (error) {\n            errorToast({ title: t(`billing.admin.products.${scope}.title`), error });\n            throw error; // keeps the dialog open — ConfirmDialog swallows rejections\n          }\n        }}\n      />\n    </>\n  );\n}\n","\"use client\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useTranslations } from \"next-intl\";\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { v4 } from \"uuid\";\nimport { z } from \"zod\";\nimport { EditorSheet, FormInput, FormTextarea } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { useI18nRouter } from \"../../../../../i18n\";\nimport { useProductContext } from \"../../../contexts/ProductContext\";\nimport { StripeProductInterface } from \"../../data/stripe-product.interface\";\n\nexport type ProductEditorProps = {\n  product?: StripeProductInterface;\n  propagateChanges?: (product: StripeProductInterface) => void;\n  onSuccess?: () => void | Promise<void>;\n  trigger?: ReactNode;\n  forceShow?: boolean;\n  onClose?: () => void;\n  dialogOpen?: boolean;\n  onDialogOpenChange?: (open: boolean) => void;\n};\n\nfunction ProductEditorInternal({\n  product,\n  propagateChanges,\n  onSuccess,\n  trigger,\n  forceShow,\n  onClose,\n  dialogOpen,\n  onDialogOpenChange,\n}: ProductEditorProps) {\n  const t = useTranslations();\n  const router = useI18nRouter();\n  const { createProduct, updateProduct } = useProductContext();\n  const isEdit = !!product;\n\n  const formSchema = useMemo(\n    () =>\n      z.object({\n        id: z.uuidv4(),\n        name: z.string().min(1, { message: t(\"billing.admin.products.errors.name\") }),\n        description: z.string().optional(),\n      }),\n    [t],\n  );\n\n  // `active` is deliberately absent: archiving is the single deactivation path\n  // (ProductArchiver), and a second toggle here would let the two disagree.\n  const getDefaultValues = useCallback(\n    () => ({\n      id: product?.id ?? v4(),\n      name: product?.name ?? \"\",\n      description: product?.description ?? \"\",\n    }),\n    [product],\n  );\n\n  const form = useForm<z.infer<typeof formSchema>>({\n    resolver: zodResolver(formSchema),\n    defaultValues: getDefaultValues(),\n  });\n\n  return (\n    <EditorSheet\n      form={form}\n      entityType={t(\"billing.admin.products.entity\")}\n      entityName={product?.name}\n      isEdit={isEdit}\n      module={Modules.StripeProduct}\n      size=\"md\"\n      propagateChanges={propagateChanges}\n      onSuccess={onSuccess}\n      onNavigate={(url) => router.push(url)}\n      onSubmit={async (values) => {\n        const payload = { id: values.id, name: values.name, description: values.description };\n        return isEdit ? await updateProduct(payload) : await createProduct(payload);\n      }}\n      onReset={getDefaultValues}\n      trigger={trigger}\n      forceShow={forceShow}\n      onClose={onClose}\n      dialogOpen={dialogOpen}\n      onDialogOpenChange={onDialogOpenChange}\n    >\n      <div className=\"flex w-full flex-col gap-y-4\">\n        <FormInput\n          form={form}\n          id=\"name\"\n          name={t(\"billing.admin.products.fields.name\")}\n          placeholder={t(\"billing.admin.products.placeholders.name\")}\n          isRequired\n        />\n        <FormTextarea\n          form={form}\n          id=\"description\"\n          name={t(\"billing.admin.products.fields.description\")}\n          placeholder={t(\"billing.admin.products.placeholders.description\")}\n          className=\"min-h-32\"\n        />\n      </div>\n    </EditorSheet>\n  );\n}\n\nexport default function ProductEditor(props: ProductEditorProps) {\n  return <ProductEditorInternal {...props} />;\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { DetailField, SectionHeader } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { usePageUrlGenerator } from \"../../../../../hooks\";\nimport { Badge, Link } from \"../../../../../shadcnui\";\nimport { formatCurrency, formatInterval } from \"../../../components/utils/currency\";\nimport { usePriceContext } from \"../../../contexts/PriceContext\";\n\nexport function PriceDetails() {\n  const t = useTranslations();\n  const generateUrl = usePageUrlGenerator();\n  const { price } = usePriceContext();\n\n  if (!price) return null;\n\n  const isRecurring = price.priceType === \"recurring\";\n\n  return (\n    <div className=\"flex w-full flex-col gap-y-8\">\n      <div className=\"flex w-full flex-col gap-y-4\">\n        <SectionHeader>{t(\"billing.admin.prices.title\")}</SectionHeader>\n        <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n          <DetailField\n            label={t(\"billing.admin.prices.fields.product\")}\n            value={\n              price.product ? (\n                <Link href={generateUrl({ page: Modules.StripeProduct, id: price.product.id })}>\n                  {price.product.name}\n                </Link>\n              ) : (\n                \"—\"\n              )\n            }\n          />\n          <DetailField\n            label={t(\"billing.admin.prices.fields.status\")}\n            value={\n              <span className=\"flex flex-wrap items-center gap-1\">\n                {price.active ? (\n                  <Badge variant=\"softGreen\">{t(\"billing.admin.prices.status.active\")}</Badge>\n                ) : (\n                  <Badge variant=\"softGray\">{t(\"billing.admin.prices.status.archived\")}</Badge>\n                )}\n                {price.isTrial && <Badge variant=\"softBlue\">{t(\"billing.admin.prices.badge.trial\")}</Badge>}\n              </span>\n            }\n          />\n          <DetailField\n            label={t(\"billing.admin.prices.fields.amount\")}\n            value={<span className=\"tabular-nums\">{formatCurrency(price.unitAmount, price.currency)}</span>}\n          />\n          <DetailField label={t(\"billing.admin.prices.fields.currency\")} value={price.currency.toUpperCase()} />\n          <DetailField\n            label={t(\"billing.admin.prices.fields.type\")}\n            value={isRecurring ? t(\"billing.admin.prices.type.recurring\") : t(\"billing.admin.prices.type.oneTime\")}\n          />\n          <DetailField label={t(\"billing.admin.prices.fields.billing\")} value={formatInterval(price)} />\n          {isRecurring && (\n            <DetailField\n              label={t(\"billing.admin.prices.fields.intervalCount\")}\n              value={<span className=\"tabular-nums\">{price.recurring?.intervalCount ?? 1}</span>}\n            />\n          )}\n          {isRecurring && (\n            <DetailField\n              label={t(\"billing.admin.prices.fields.usageType\")}\n              value={\n                price.recurring?.usageType === \"metered\"\n                  ? t(\"billing.admin.prices.usage.metered\")\n                  : t(\"billing.admin.prices.usage.licensed\")\n              }\n            />\n          )}\n        </div>\n      </div>\n\n      <div className=\"flex w-full flex-col gap-y-4\">\n        <SectionHeader>{t(\"billing.admin.prices.fields.platformFeatures\")}</SectionHeader>\n        <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n          <DetailField\n            label={t(\"billing.admin.prices.fields.token\")}\n            value={<span className=\"tabular-nums\">{price.token ?? \"—\"}</span>}\n          />\n          <DetailField\n            label={t(\"billing.admin.prices.fields.stripeId\")}\n            value={<span className=\"tabular-nums\">{price.stripePriceId}</span>}\n          />\n          <DetailField\n            label={t(\"billing.admin.prices.fields.description\")}\n            value={price.description ?? \"—\"}\n            className=\"md:col-span-2\"\n          />\n          <DetailField\n            label={t(\"billing.admin.prices.fields.features\")}\n            className=\"md:col-span-2\"\n            value={\n              price.features && price.features.length > 0 ? (\n                <ul className=\"flex flex-col gap-1 text-sm\">\n                  {price.features.map((feature) => (\n                    <li key={feature}>{feature}</li>\n                  ))}\n                </ul>\n              ) : (\n                \"—\"\n              )\n            }\n          />\n          <DetailField\n            label={t(\"billing.admin.prices.fields.platformFeatures\")}\n            className=\"md:col-span-2\"\n            value={\n              price.priceFeatures.length > 0 ? (\n                <span className=\"flex flex-wrap items-center gap-1\">\n                  {price.priceFeatures.map((feature) => (\n                    <Badge key={feature.id} variant=\"softGray\">\n                      {feature.name}\n                    </Badge>\n                  ))}\n                </span>\n              ) : (\n                \"—\"\n              )\n            }\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { RoundPageContainer } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { usePriceContext } from \"../../../contexts/PriceContext\";\nimport { PriceDetails } from \"../details/PriceDetails\";\n\nexport function PriceContainer() {\n  const { price } = usePriceContext();\n\n  if (!price) return null;\n\n  // No tabs: a price is a single flat record. RoundPageContainer without\n  // `tabs` and without `fullWidth` gives the centred max-w-6xl column and the\n  // title bar that PriceContext's chrome fills.\n  return (\n    <RoundPageContainer module={Modules.StripePrice} id={price.id}>\n      <PriceDetails />\n    </RoundPageContainer>\n  );\n}\n","\"use client\";\n\nimport { DollarSignIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { ReactNode, useEffect } from \"react\";\nimport { ContentListTable } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { DataListRetriever, useDataListRetriever } from \"../../../../../hooks\";\nimport { EmptyState } from \"../../../../../shadcnui\";\nimport { usePriceContext } from \"../../../contexts/PriceContext\";\nimport { StripePriceFields } from \"../../data/stripe-price.fields\";\nimport { StripePriceInterface } from \"../../data/stripe-price.interface\";\nimport { StripePriceService } from \"../../data/stripe-price.service\";\nimport PriceEditor from \"../forms/PriceEditor\";\n\ntype PricesListProps = {\n  productId: string;\n  /**\n   * Only when the list IS the page's own content inside a `RoundPageContainer\n   * fullWidth`. Inside a tab panel leave it unset, or ContentListTable drops its\n   * own `rounded-md border` and the table floats borderless in the panel.\n   * Mirrors ThreatList, which is rendered both ways.\n   */\n  fullWidth?: boolean;\n};\n\nexport function PricesList({ productId, fullWidth }: PricesListProps) {\n  const t = useTranslations();\n  const { priceVersion } = usePriceContext();\n\n  const data: DataListRetriever<StripePriceInterface> = useDataListRetriever({\n    retriever: (params) => StripePriceService.listPrices({ ...params, productId }),\n    retrieverParams: {},\n    module: Modules.StripePrice,\n  });\n\n  useEffect(() => {\n    if (priceVersion > 0) void data.refresh();\n  }, [priceVersion]);\n\n  const functions: ReactNode[] = [<PriceEditor key=\"create-price\" productId={productId} />];\n\n  return (\n    <ContentListTable\n      data={data}\n      fields={[\n        StripePriceFields.nickname,\n        StripePriceFields.amount,\n        StripePriceFields.interval,\n        StripePriceFields.token,\n        StripePriceFields.status,\n      ]}\n      tableGeneratorType={Modules.StripePrice}\n      functions={functions}\n      fullWidth={fullWidth}\n      title={t(\"billing.admin.prices.title\")}\n      emptyState={\n        <EmptyState\n          icon={DollarSignIcon}\n          title={t(\"billing.admin.prices.empty.title\")}\n          description={t(\"billing.admin.prices.empty.description\")}\n        />\n      }\n    />\n  );\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { RoundPageContainer } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { PriceProvider } from \"../../../contexts/PriceContext\";\nimport { useProductContext } from \"../../../contexts/ProductContext\";\nimport { PricesList } from \"../../../stripe-price/components/lists/PricesList\";\nimport { ProductDetails } from \"../details/ProductDetails\";\n\nexport function ProductContainer() {\n  const t = useTranslations();\n  const { product } = useProductContext();\n\n  if (!product) return null;\n\n  return (\n    <RoundPageContainer\n      module={Modules.StripeProduct}\n      id={product.id}\n      tabs={[\n        {\n          sectionKey: \"details\",\n          label: t(\"billing.admin.products.tabs.details\"),\n          content: <ProductDetails />,\n        },\n        {\n          key: Modules.StripePrice,\n          label: t(\"billing.admin.prices.title\"),\n          // publishChrome={false}: SharedProvider REPLACES its value for the\n          // subtree (SharedContext.tsx:35-37), so a nested provider publishing\n          // chrome here would blank this page's own title.\n          // No `fillHeight` and no `fullWidth` on the list: a ContentListTable in\n          // a tab keeps its own bordered card and flows with the panel, exactly\n          // as ThreatList does inside GoalContainer.\n          content: (\n            <PriceProvider productId={product.id} publishChrome={false}>\n              <PricesList productId={product.id} />\n            </PriceProvider>\n          ),\n        },\n      ]}\n    />\n  );\n}\n","\"use client\";\n\nimport { useTranslations } from \"next-intl\";\nimport { DetailField, SectionHeader } from \"../../../../../components\";\nimport { Badge } from \"../../../../../shadcnui\";\nimport { useProductContext } from \"../../../contexts/ProductContext\";\n\nexport function ProductDetails() {\n  const t = useTranslations();\n  const { product } = useProductContext();\n\n  if (!product) return null;\n\n  return (\n    <div className=\"flex w-full flex-col gap-y-4\">\n      <SectionHeader>{t(\"billing.admin.products.tabs.details\")}</SectionHeader>\n      <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n        <DetailField label={t(\"billing.admin.products.fields.name\")} value={product.name} />\n        <DetailField\n          label={t(\"billing.admin.products.fields.status\")}\n          value={\n            product.active ? (\n              <Badge variant=\"softGreen\">{t(\"billing.admin.products.status.active\")}</Badge>\n            ) : (\n              <Badge variant=\"softGray\">{t(\"billing.admin.products.status.archived\")}</Badge>\n            )\n          }\n        />\n        <DetailField\n          label={t(\"billing.admin.products.fields.description\")}\n          value={product.description ?? \"—\"}\n          className=\"md:col-span-2\"\n        />\n        <DetailField\n          label={t(\"billing.admin.products.fields.prices\")}\n          value={<span className=\"tabular-nums\">{product.stripePrices.length}</span>}\n        />\n        <DetailField\n          label={t(\"billing.admin.products.fields.stripeId\")}\n          value={<span className=\"tabular-nums\">{product.stripeProductId}</span>}\n        />\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport { PackageIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport { ReactNode, useEffect } from \"react\";\nimport { ContentListTable } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { DataListRetriever, useDataListRetriever } from \"../../../../../hooks\";\nimport { EmptyState } from \"../../../../../shadcnui\";\nimport { useProductContext } from \"../../../contexts/ProductContext\";\nimport { StripeProductFields } from \"../../data/stripe-product.fields\";\nimport { StripeProductInterface } from \"../../data/stripe-product.interface\";\nimport { StripeProductService } from \"../../data/stripe-product.service\";\nimport ProductEditor from \"../forms/ProductEditor\";\n\ntype ProductsListProps = {\n  /**\n   * Pass this whenever the list is the page's own content inside a\n   * `RoundPageContainer fullWidth`. Without it ContentListTable wraps itself in\n   * `rounded-md border`, drawing a second bordered card inside the page's\n   * rounded shell.\n   */\n  fullWidth?: boolean;\n};\n\nexport function ProductsList({ fullWidth }: ProductsListProps = {}) {\n  const t = useTranslations();\n  const { catalogueVersion } = useProductContext();\n\n  const data: DataListRetriever<StripeProductInterface> = useDataListRetriever({\n    retriever: (params) => StripeProductService.listProducts(params),\n    retrieverParams: {},\n    module: Modules.StripeProduct,\n  });\n\n  // Archiving and restoring happen on the detail page, so the list has to learn\n  // about them through the provider's counter rather than a direct callback.\n  useEffect(() => {\n    if (catalogueVersion > 0) void data.refresh();\n  }, [catalogueVersion]);\n\n  const functions: ReactNode[] = [<ProductEditor key=\"create-product\" />];\n\n  return (\n    <ContentListTable\n      data={data}\n      fields={[StripeProductFields.name, StripeProductFields.status, StripeProductFields.prices]}\n      tableGeneratorType={Modules.StripeProduct}\n      functions={functions}\n      fullWidth={fullWidth}\n      title={t(\"billing.admin.products.title\")}\n      emptyState={\n        <EmptyState\n          icon={PackageIcon}\n          title={t(\"billing.admin.products.empty.title\")}\n          description={t(\"billing.admin.products.empty.description\")}\n        />\n      }\n    />\n  );\n}\n","\"use client\";\n\nimport { RoundPageContainer } from \"../../../../../components\";\nimport { Modules } from \"../../../../../core\";\nimport { ProductProvider } from \"../../../contexts/ProductContext\";\nimport { ProductsList } from \"../lists/ProductsList\";\n\n/**\n * Page container for the administrative product list.\n *\n * Client component by necessity: `module={Modules.StripeProduct}` is a registry\n * entry carrying an icon component and methods, which a Server Component cannot\n * pass across the boundary. Routes mount this container instead — the same\n * shape as every other list page.\n *\n * No `forceHeader`: ContentListTable draws its own header row with the title\n * and the create action, exactly as the company and user list pages do.\n */\nexport function ProductsListContainer() {\n  return (\n    <ProductProvider>\n      <RoundPageContainer module={Modules.StripeProduct} fullWidth>\n        <ProductsList fullWidth />\n      </RoundPageContainer>\n    </ProductProvider>\n  );\n}\n"],"mappings":"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","names":["ChevronRight","jsx","jsxs","ChevronRight","jsx","jsxs","ChevronRight","jsx","jsxs","getStatusBadgeVariant","formatDate","ChevronRight","ChevronRight","jsx","jsxs","ChevronRight","CreditCard","Loader2","Wallet","useCallback","useEffect","useMemo","useState","CreditCard","useEffect","useState","useState","jsx","jsxs","useState","jsx","jsxs","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsx","jsxs","useState","useEffect","CreditCard","useEffect","useState","useState","formatDate","ExternalLink","jsx","jsx","jsxs","formatDate","ExternalLink","Fragment","jsx","jsxs","useState","formatDate","jsx","jsxs","useState","useEffect","CreditCard","useEffect","useState","useState","useState","useState","jsx","jsxs","useState","formatDate","jsx","statusConfig","Fragment","jsx","jsxs","formatPlanName","useState","formatDate","Fragment","jsx","jsxs","formatPlanName","useState","formatDate","jsx","jsxs","useState","useEffect","CreditCard","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","formatDate","Check","Fragment","jsx","jsxs","Check","useCallback","useEffect","useRef","useCallback","useCallback","Check","jsx","jsxs","Check","useEffect","useMemo","useState","jsx","jsxs","useState","useEffect","useMemo","hasMonthly","hasYearly","useState","Check","Loader2","jsx","jsxs","useState","Check","Loader2","Fragment","jsx","jsxs","formatInterval","jsx","jsxs","jsx","jsxs","useCallback","useRef","useEffect","Activity","useEffect","useState","Activity","jsx","jsxs","formatDate","Activity","jsx","jsx","jsxs","useState","useEffect","hasMeteredSubscriptions","Activity","jsx","jsxs","jsx","jsxs","AlertCircle","jsx","jsxs","AlertCircle","Fragment","jsx","jsxs","useState","useCallback","useMemo","subscriptions","useEffect","Wallet","Loader2","CreditCard","useMemo","Fragment","jsx","useMemo","useTranslations","useCallback","useMemo","useState","useState","Fragment","jsx","jsxs","useState","zodResolver","useTranslations","useCallback","useEffect","useMemo","useState","useForm","v4","z","jsx","jsxs","useTranslations","useState","useEffect","formSchema","useMemo","z","useCallback","useForm","zodResolver","v4","_","jsx","useTranslations","useState","useCallback","value","useMemo","useTranslations","createContext","useCallback","useContext","useMemo","useState","ArchiveIcon","RotateCcwIcon","useTranslations","useState","Fragment","jsx","jsxs","useTranslations","useState","RotateCcwIcon","ArchiveIcon","zodResolver","useTranslations","useCallback","useMemo","useForm","v4","z","jsx","jsxs","useTranslations","formSchema","useMemo","z","useCallback","v4","useForm","zodResolver","jsx","createContext","defaultContextValue","useTranslations","useState","useCallback","value","useMemo","useContext","useTranslations","jsx","jsxs","useTranslations","jsx","useTranslations","useEffect","jsx","useTranslations","useEffect","useTranslations","useTranslations","jsx","jsxs","useTranslations","jsx","useTranslations","useTranslations","useEffect","jsx","useTranslations","useEffect","jsx"]}