{"version":3,"file":"subtrak-angular.mjs","sources":["../../../projects/subtrak-angular/src/lib/tokens/config.token.ts","../../../projects/subtrak-angular/src/lib/utils/http-client-factory.ts","../../../projects/subtrak-angular/src/lib/services/subtrak.service.ts","../../../projects/subtrak-angular/src/lib/models/index.ts","../../../projects/subtrak-angular/src/lib/services/subscriptions.service.ts","../../../projects/subtrak-angular/src/lib/utils/entitlement-checker.ts","../../../projects/subtrak-angular/src/lib/services/entitlements.service.ts","../../../projects/subtrak-angular/src/lib/services/usage.service.ts","../../../projects/subtrak-angular/src/lib/services/payment-methods.service.ts","../../../projects/subtrak-angular/src/lib/services/invoices.service.ts","../../../projects/subtrak-angular/src/lib/services/payment-links.service.ts","../../../projects/subtrak-angular/src/lib/services/customers.service.ts","../../../projects/subtrak-angular/src/lib/services/index.ts","../../../projects/subtrak-angular/src/lib/errors/subtrak-error.ts","../../../projects/subtrak-angular/src/lib/interceptors/auth.interceptor.ts","../../../projects/subtrak-angular/src/lib/utils/case-transform.ts","../../../projects/subtrak-angular/src/lib/interceptors/case-transform.interceptor.ts","../../../projects/subtrak-angular/src/lib/interceptors/error.interceptor.ts","../../../projects/subtrak-angular/src/lib/interceptors/retry.interceptor.ts","../../../projects/subtrak-angular/src/lib/components/pricing-table/pricing-table.component.ts","../../../projects/subtrak-angular/src/lib/components/pricing-table/pricing-table.component.html","../../../projects/subtrak-angular/src/lib/components/subscription-status/subscription-status.component.ts","../../../projects/subtrak-angular/src/lib/components/subscription-status/subscription-status.component.html","../../../projects/subtrak-angular/src/lib/components/usage-meter/usage-meter.component.ts","../../../projects/subtrak-angular/src/lib/components/usage-meter/usage-meter.component.html","../../../projects/subtrak-angular/src/lib/components/entitlement-display/entitlement-display.component.ts","../../../projects/subtrak-angular/src/lib/components/entitlement-display/entitlement-display.component.html","../../../projects/subtrak-angular/src/lib/components/billing-portal/billing-portal.component.ts","../../../projects/subtrak-angular/src/lib/components/billing-portal/billing-portal.component.html","../../../projects/subtrak-angular/src/lib/components/payment-provider-card/payment-provider-card.component.ts","../../../projects/subtrak-angular/src/lib/components/payment-provider-card/payment-provider-card.component.html","../../../projects/subtrak-angular/src/lib/components/payment-link-alert/payment-link-alert.component.ts","../../../projects/subtrak-angular/src/lib/components/payment-link-alert/payment-link-alert.component.html","../../../projects/subtrak-angular/src/lib/components/index.ts","../../../projects/subtrak-angular/src/lib/directives/feature-gate.directive.ts","../../../projects/subtrak-angular/src/lib/directives/quota-guard.directive.ts","../../../projects/subtrak-angular/src/lib/directives/index.ts","../../../projects/subtrak-angular/src/lib/guards/entitlement.guard.ts","../../../projects/subtrak-angular/src/lib/guards/index.ts","../../../projects/subtrak-angular/src/lib/pipes/entitlement-value.pipe.ts","../../../projects/subtrak-angular/src/lib/pipes/index.ts","../../../projects/subtrak-angular/src/public-api.ts","../../../projects/subtrak-angular/src/subtrak-angular.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Configuration interface for Subtrak SDK\n */\nexport interface SubtrakConfig {\n  /**\n   * Public API key (pk_test_* or pk_live_*)\n   * For read-only access to products, prices, and public data\n   */\n  publicKey?: string;\n\n  /**\n   * Secret API key (sk_test_* or sk_live_*)\n   * For full API access (use only in secure server-side contexts)\n   */\n  secretKey?: string;\n\n  /**\n   * API base URL\n   * @default 'https://subtrak-api-staging-378055833376.europe-west1.run.app/api/v5/'\n   */\n  apiUrl?: string;\n\n  /**\n   * Request timeout in milliseconds\n   * @default 30000 (30 seconds)\n   */\n  timeout?: number;\n\n  /**\n   * Maximum number of retry attempts for failed requests\n   * @default 3\n   */\n  maxRetries?: number;\n\n  /**\n   * Customer ID for customer-scoped operations\n   * Can be set later via SubtrakService.setCustomerId()\n   */\n  customerId?: string;\n\n  /**\n   * Enable debug logging\n   * @default false\n   */\n  debug?: boolean;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_SUBTRAK_CONFIG: Partial<SubtrakConfig> = {\n  apiUrl: 'https://subtrak-api-staging-378055833376.europe-west1.run.app/api/v5/',\n  timeout: 30000,\n  maxRetries: 3,\n  debug: false,\n};\n\n/**\n * Injection token for Subtrak configuration\n */\nexport const SUBTRAK_CONFIG = new InjectionToken<SubtrakConfig>('SUBTRAK_CONFIG', {\n  providedIn: 'root',\n  factory: () => DEFAULT_SUBTRAK_CONFIG as SubtrakConfig,\n});\n","import { HttpBackend, HttpClient, HttpHandler, HttpEvent, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n/**\n * Simple HttpHandler that wraps the backend with a transformation function\n */\nclass CustomHttpHandler implements HttpHandler {\n    constructor(\n        private backend: HttpBackend,\n        private transform: (req: HttpRequest<any>, next: (req: HttpRequest<any>) => Observable<HttpEvent<any>>) => Observable<HttpEvent<any>>\n    ) { }\n\n    handle(req: HttpRequest<any>): Observable<HttpEvent<any>> {\n        return this.transform(req, (r) => this.backend.handle(r));\n    }\n}\n\n/**\n * Create an isolated HttpClient with a custom request/response handler\n * This bypasses the global HTTP_INTERCEPTORS\n */\nexport function createIsolatedHttpClient(\n    backend: HttpBackend,\n    transform: (req: HttpRequest<any>, next: (req: HttpRequest<any>) => Observable<HttpEvent<any>>) => Observable<HttpEvent<any>>\n): HttpClient {\n    const handler = new CustomHttpHandler(backend, transform);\n    return new HttpClient(handler);\n}\n","import { Injectable, Inject } from '@angular/core';\r\nimport { HttpClient, HttpBackend, HttpResponse, HttpErrorResponse } from '@angular/common/http';\r\nimport { BehaviorSubject, Observable, throwError, timer } from 'rxjs';\r\nimport { map, catchError, retry } from 'rxjs/operators';\r\nimport { SUBTRAK_CONFIG, SubtrakConfig, DEFAULT_SUBTRAK_CONFIG } from '../tokens/config.token';\r\nimport { createIsolatedHttpClient } from '../utils/http-client-factory';\r\n\r\n/**\r\n * Main Subtrak SDK service\r\n */\r\n@Injectable()\r\nexport class SubtrakService {\r\n  private customerIdSubject: BehaviorSubject<string | null>;\r\n  public customerId$: Observable<string | null>;\r\n  private http: HttpClient;\r\n\r\n  constructor(\r\n    @Inject(SUBTRAK_CONFIG) public config: SubtrakConfig,\r\n    private httpBackend: HttpBackend\r\n  ) {\r\n    // Initialize BehaviorSubject\r\n    this.customerIdSubject = new BehaviorSubject<string | null>(config.customerId || null);\r\n    this.customerId$ = this.customerIdSubject.asObservable();\r\n\r\n    // Create isolated HttpClient with SDK-specific request/response transformation\r\n    this.http = createIsolatedHttpClient(this.httpBackend, (req, next) => {\r\n      // 1. Auth: Add authorization headers for Subtrak API requests\r\n      if (req.url.includes('/api/v5/')) {\r\n        const apiKey = config.secretKey || config.publicKey;\r\n        if (!apiKey) {\r\n          throw new Error('No API key provided. Please configure either publicKey or secretKey.');\r\n        }\r\n        if (!apiKey.startsWith('pk_') && !apiKey.startsWith('sk_')) {\r\n          throw new Error('Invalid API key format. Must start with pk_ or sk_.');\r\n        }\r\n\r\n        req = req.clone({\r\n          setHeaders: {\r\n            'Authorization': `Bearer ${apiKey}`,\r\n            'Content-Type': 'application/json',\r\n          },\r\n        });\r\n      }\r\n\r\n      // 2. Case Transform: Transform request body and query params to snake_case\r\n      if (req.url.includes('/api/v5/')) {\r\n        // Handle Body\r\n        if (req.body && (req.method === 'POST' || req.method === 'PUT' || req.method === 'PATCH')) {\r\n          const transformedBody = this.transformKeysToSnakeCase(req.body);\r\n          req = req.clone({ body: transformedBody });\r\n        }\r\n\r\n        // Handle Query Parameters\r\n        if (req.params && req.params.keys().length > 0) {\r\n          let snakeParams = req.params;\r\n          req.params.keys().forEach(key => {\r\n            const snakeKey = key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\r\n            if (snakeKey !== key) {\r\n              const values = req.params.getAll(key);\r\n              snakeParams = snakeParams.delete(key);\r\n              values?.forEach(v => {\r\n                snakeParams = snakeParams.append(snakeKey, v);\r\n              });\r\n            }\r\n          });\r\n          req = req.clone({ params: snakeParams });\r\n        }\r\n      }\r\n\r\n      // 3. Execute request and handle response\r\n      return next(req).pipe(\r\n        // Transform response from snake_case to camelCase (skip for blob responses)\r\n        map((event: any) => {\r\n          if (event instanceof HttpResponse && event.body && req.url.includes('/api/v5/')) {\r\n            // Skip transformation for blob responses (e.g., PDF downloads)\r\n            if (req.responseType === 'blob') {\r\n              return event;\r\n            }\r\n            const transformedBody = this.transformKeysToCamelCase(event.body);\r\n            return event.clone({ body: transformedBody });\r\n          }\r\n          return event;\r\n        }),\r\n        // Error handling\r\n        catchError((error: HttpErrorResponse) => {\r\n          if (req.url.includes('/api/v5/')) {\r\n            // Transform HTTP errors into typed errors\r\n            const message = error.error?.message || error.error?.error || error.message || 'An error occurred';\r\n            console.error('[Subtrak SDK] API Error:', message, error);\r\n          }\r\n          return throwError(() => error);\r\n        }),\r\n        // Retry logic for GET requests\r\n        retry({\r\n          count: config.maxRetries || 3,\r\n          delay: (error: HttpErrorResponse, retryCount: number) => {\r\n            if (!req.url.includes('/api/v5/') || !['GET', 'HEAD', 'OPTIONS'].includes(req.method)) {\r\n              throw error;\r\n            }\r\n\r\n            const retryableStatusCodes = [429, 500, 502, 503, 504];\r\n            const shouldRetry = error.status === 0 || retryableStatusCodes.includes(error.status);\r\n\r\n            if (!shouldRetry) {\r\n              throw error;\r\n            }\r\n\r\n            const delay = Math.min(500 * Math.pow(2, retryCount - 1), 10000);\r\n            if (config.debug) {\r\n              console.log(`[Subtrak SDK] Retry attempt ${retryCount} after ${delay}ms`);\r\n            }\r\n            return timer(delay);\r\n          },\r\n        })\r\n      );\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get the configured API base URL\r\n   */\r\n  get apiUrl(): string {\r\n    return this.config.apiUrl || DEFAULT_SUBTRAK_CONFIG.apiUrl!;\r\n  }\r\n\r\n  /**\r\n   * Set the customer ID for customer-scoped operations\r\n   */\r\n  setCustomerId(customerId: string): void {\r\n    this.customerIdSubject.next(customerId);\r\n  }\r\n\r\n  /**\r\n   * Get the current customer ID\r\n   */\r\n  getCustomerId(): string | null {\r\n    return this.customerIdSubject.value;\r\n  }\r\n\r\n  /**\r\n   * Clear the customer ID\r\n   */\r\n  clearCustomerId(): void {\r\n    this.customerIdSubject.next(null);\r\n  }\r\n\r\n  /**\r\n   * Make a GET request to the Subtrak API\r\n   */\r\n  get<T>(endpoint: string, params?: any, options?: { responseType?: 'json' | 'blob' | 'text' | 'arraybuffer' }): Observable<T> {\r\n    const url = `${this.apiUrl}${endpoint}`;\r\n    // Explicitly cast the options to match HttpClient signature requirements\r\n    return this.http.get<T>(url, { params, ...options } as any) as Observable<T>;\r\n  }\r\n\r\n  /**\r\n   * Make a POST request to the Subtrak API\r\n   */\r\n  post<T>(endpoint: string, body: any): Observable<T> {\r\n    const url = `${this.apiUrl}${endpoint}`;\r\n    return this.http.post<T>(url, body);\r\n  }\r\n\r\n  /**\r\n   * Make a PUT request to the Subtrak API\r\n   */\r\n  put<T>(endpoint: string, body: any): Observable<T> {\r\n    const url = `${this.apiUrl}${endpoint}`;\r\n    return this.http.put<T>(url, body);\r\n  }\r\n\r\n  /**\r\n   * Make a PATCH request to the Subtrak API\r\n   */\r\n  patch<T>(endpoint: string, body: any): Observable<T> {\r\n    const url = `${this.apiUrl}${endpoint}`;\r\n    return this.http.patch<T>(url, body);\r\n  }\r\n\r\n  /**\r\n   * Make a DELETE request to the Subtrak API\r\n   */\r\n  delete<T>(endpoint: string): Observable<T> {\r\n    const url = `${this.apiUrl}${endpoint}`;\r\n    return this.http.delete<T>(url);\r\n  }\r\n\r\n  /**\r\n   * Enable debug logging\r\n   */\r\n  enableDebug(): void {\r\n    this.config.debug = true;\r\n  }\r\n\r\n  /**\r\n   * Disable debug logging\r\n   */\r\n  disableDebug(): void {\r\n    this.config.debug = false;\r\n  }\r\n\r\n  /**\r\n   * Log debug message if debug mode is enabled\r\n   */\r\n  debug(message: string, ...args: any[]): void {\r\n    if (this.config.debug) {\r\n      console.log(`[Subtrak SDK] ${message}`, ...args);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Transform object keys from camelCase to snake_case\r\n   */\r\n  private transformKeysToSnakeCase(obj: any): any {\r\n    if (obj === null || obj === undefined) {\r\n      return obj;\r\n    }\r\n\r\n    if (Array.isArray(obj)) {\r\n      return obj.map(item => this.transformKeysToSnakeCase(item));\r\n    }\r\n\r\n    if (typeof obj === 'object' && obj.constructor === Object) {\r\n      return Object.keys(obj).reduce((result: any, key) => {\r\n        const snakeKey = key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\r\n        result[snakeKey] = this.transformKeysToSnakeCase(obj[key]);\r\n        return result;\r\n      }, {});\r\n    }\r\n\r\n    return obj;\r\n  }\r\n\r\n  /**\r\n   * Transform object keys from snake_case to camelCase\r\n   */\r\n  private transformKeysToCamelCase(obj: any): any {\r\n    if (obj === null || obj === undefined) {\r\n      return obj;\r\n    }\r\n\r\n    if (Array.isArray(obj)) {\r\n      return obj.map(item => this.transformKeysToCamelCase(item));\r\n    }\r\n\r\n    if (typeof obj === 'object' && obj.constructor === Object) {\r\n      return Object.keys(obj).reduce((result: any, key) => {\r\n        const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\r\n        result[camelKey] = this.transformKeysToCamelCase(obj[key]);\r\n        return result;\r\n      }, {});\r\n    }\r\n\r\n    return obj;\r\n  }\r\n}\r\n","/**\n * Subtrak Angular SDK - Type Definitions\n *\n * These types match the Subtrak V5 API structure\n */\n\n// ============================================================================\n// ENUMS\n// ============================================================================\n\nexport enum BillingInterval {\n  DAILY = 'DAILY',\n  WEEKLY = 'WEEKLY',\n  MONTHLY = 'MONTHLY',\n  QUARTERLY = 'QUARTERLY',\n  ANNUAL = 'ANNUAL',\n}\n\nexport enum PriceType {\n  RECURRING = 'RECURRING',\n  ONE_TIME = 'ONE_TIME',\n  METERED = 'METERED',\n}\n\nexport enum PricingScheme {\n  FLAT = 'FLAT',\n  PER_UNIT = 'PER_UNIT',\n  TIERED = 'TIERED',\n  VOLUME = 'VOLUME',\n}\n\nexport enum EntitlementType {\n  BOOLEAN = 'BOOLEAN',\n  NUMERIC = 'NUMERIC',\n  ENUM = 'ENUM',\n  METERED = 'METERED',\n}\n\nexport enum EntitlementCategory {\n  FEATURE = 'FEATURE',\n  LIMIT = 'LIMIT',\n  QUOTA = 'QUOTA',\n  ADDON = 'ADDON',\n}\n\nexport enum EntitlementScope {\n  GLOBAL = 'GLOBAL',\n  PER_LOCATION = 'PER_LOCATION',\n  PER_USER = 'PER_USER',\n}\n\nexport enum ResetPeriod {\n  NEVER = 'NEVER',\n  BILLING_PERIOD = 'BILLING_PERIOD',\n  MONTHLY = 'MONTHLY',\n  ANNUALLY = 'ANNUALLY',\n}\n\nexport enum SubscriptionStatus {\n  FREE = 'FREE',\n  TRIAL = 'TRIAL',\n  PENDING = 'PENDING',\n  ACTIVE = 'ACTIVE',\n  PAST_DUE = 'PAST_DUE',\n  SUSPENDED = 'SUSPENDED',\n  CANCELLED = 'CANCELLED',\n  EXPIRED = 'EXPIRED',\n}\n\nexport enum InvoiceStatus {\n  DRAFT = 'DRAFT',\n  OPEN = 'OPEN',\n  PAID = 'PAID',\n  VOID = 'VOID',\n  UNCOLLECTIBLE = 'UNCOLLECTIBLE',\n}\n\nexport enum PaymentProvider {\n  STRIPE = 'STRIPE',\n  PAYMOB = 'PAYMOB', // Legacy\n  PAYMOB_EGYPT = 'PAYMOB_EGYPT',\n  PAYMOB_KSA = 'PAYMOB_KSA',\n  PAYMOB_UAE = 'PAYMOB_UAE',\n  PAYMOB_OMAN = 'PAYMOB_OMAN',\n  PAYMOB_PAKISTAN = 'PAYMOB_PAKISTAN',\n  PAYPAL = 'PAYPAL',\n  RAZORPAY = 'RAZORPAY',\n  PADDLE = 'PADDLE',\n  SQUARE = 'SQUARE',\n}\n\nexport enum PaymentStatus {\n  PENDING = 'PENDING',\n  PROCESSING = 'PROCESSING',\n  SUCCEEDED = 'SUCCEEDED',\n  FAILED = 'FAILED',\n  REFUNDED = 'REFUNDED',\n  PARTIALLY_REFUNDED = 'PARTIALLY_REFUNDED',\n}\n\n// ============================================================================\n// CORE MODELS\n// ============================================================================\n\nexport interface Country {\n  id: string;\n  code: string;\n  name: string;\n  currency: string;\n  defaultTaxRate: string | null;\n  defaultTaxName: string | null;\n  isActive: boolean;\n  flag?: string;\n}\n\nexport interface Product {\n  id: string;\n  tenantId: string;\n  name: string;\n  slug: string;\n  description: string | null;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface Customer {\n  id: string;\n  tenantId: string;\n  countryCode: string;\n  name: string;\n  email: string;\n  phone: string | null;\n  billingAddressLine1: string | null;\n  billingAddressLine2: string | null;\n  billingCity: string | null;\n  billingState: string | null;\n  billingPostalCode: string | null;\n  billingCountry: string | null;\n  createdAt: string;\n  updatedAt: string;\n}\n\n// ============================================================================\n// ENTITLEMENTS & METERS\n// ============================================================================\n\nexport interface Entitlement {\n  id: string;\n  tenantId: string;\n  productId: string | null;\n  code: string;\n  name: string;\n  description: string | null;\n  type: EntitlementType;\n  category: EntitlementCategory;\n  scope: EntitlementScope | null;\n  unit: string | null;\n  resetPeriod: ResetPeriod | null;\n  meterId: string | null;\n  allowedValues: string[] | null;\n  isActive: boolean;\n  createdAt: string;\n  updatedAt: string;\n}\n\n/**\n * Entitlement with its resolved value for a specific subscription/customer\n */\nexport interface EntitlementValue {\n  id: string;\n  code: string;\n  name: string;\n  description: string | null;\n  type: EntitlementType;\n  category: EntitlementCategory;\n  scope: EntitlementScope | null;\n  unit: string | null;\n  resetPeriod: ResetPeriod | null;\n  value: boolean | number | string | null;\n  allowedValues?: string[];\n}\n\nexport interface Meter {\n  id: string;\n  tenantId: string;\n  productId: string;\n  code: string;\n  name: string;\n  description: string | null;\n  eventName: string;\n  aggregationType: string;\n  valueProperty: string | null;\n  groupBy: string | null;\n  isActive: boolean;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface UsageSummary {\n  id: string;\n  subscriptionId: string;\n  meterId: string;\n  periodStart: string;\n  periodEnd: string;\n  totalUsage: string;\n  includedUnits: string | null;\n  billableUnits: string;\n  usageByGroup: Record<string, any> | null;\n  createdAt: string;\n}\n\n// ============================================================================\n// PRICING\n// ============================================================================\n\nexport interface PriceTier {\n  upTo: number;\n  unitAmount: string;\n}\n\nexport interface Price {\n  id: string;\n  tenantId: string;\n  productId: string;\n  nickname: string;\n  description: string | null;\n  type: PriceType;\n  billingInterval: BillingInterval | null;\n  billingIntervalCount: number | null;\n  unitAmount: string | null;\n  currency: string;\n  pricingScheme: PricingScheme;\n  tiers: PriceTier[] | null;\n  countryCode: string;\n  trialPeriodDays: number | null;\n  isFreePlan?: boolean;\n  isTrialPlan?: boolean;\n  isActive: boolean;\n  createdAt: string;\n  updatedAt: string;\n}\n\n// ... (existing code)\nexport interface PriceWithEntitlements extends Price {\n  product?: Pick<Product, 'id' | 'name' | 'slug'>;\n  entitlements: EntitlementValue[];\n}\n\nexport interface PlanOption {\n  name: string;\n  description: string | null;\n  prices: PriceWithEntitlements[];\n}\n\n// ============================================================================\n// SUBSCRIPTIONS\n// ============================================================================\n\nexport interface Subscription {\n  id: string;\n  customerId: string;\n  priceId: string;\n  quantity: number;\n  status: SubscriptionStatus;\n  trialStart: string | null;\n  trialEnd: string | null;\n  currentPeriodStart: string;\n  currentPeriodEnd: string | null;\n  cancelAtPeriodEnd: boolean;\n  cancelledAt: string | null;\n  priceSnapshot: Record<string, any>;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface SubscriptionWithRelations extends Subscription {\n  customer: Pick<Customer, 'id' | 'name' | 'email'>;\n  price: {\n    id: string;\n    nickname: string;\n    currency: string;\n    unitAmount: string | null;\n    product: Pick<Product, 'id' | 'name' | 'slug'>;\n  };\n}\n\n// ============================================================================\n// BILLING & INVOICING\n// ============================================================================\n\nexport interface InvoiceLineItem {\n  description: string;\n  quantity: number;\n  unitAmount: string;\n  amount: string;\n  type: 'RECURRING' | 'METERED' | 'OVERAGE' | 'PRORATION';\n  metadata?: Record<string, any>;\n}\n\nexport interface Invoice {\n  id: string;\n  customerId: string;\n  invoiceNumber: string;\n  subtotal: string;\n  tax: string;\n  total: string;\n  amountPaid: string;\n  amountDue: string;\n  lineItems: InvoiceLineItem[];\n  currency: string;\n  issueDate: string;\n  dueDate: string;\n  paidAt: string | null;\n  status: InvoiceStatus;\n  pdfUrl: string | null;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface InvoiceWithRelations extends Invoice {\n  customer: Pick<Customer, 'id' | 'name' | 'email'>;\n  payments?: any[];\n  notes?: string | null;\n}\n\nexport interface PaymentMethod {\n  id: string;\n  customerId: string;\n  provider: PaymentProvider;\n  providerMethodId: string;\n  type: string;\n  cardBrand: string | null;\n  cardLast4: string | null;\n  cardExpMonth: number | null;\n  cardExpYear: number | null;\n  isDefault: boolean;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface PaymentProviderConfig {\n  provider: PaymentProvider;\n  publishableKey: string;\n  supportedCountries: string[];\n  isActive: boolean;\n}\n\nexport interface AddPaymentMethodResult {\n  paymentMethod: PaymentMethod;\n  setupIntent?: any;\n}\n\n// ============================================================================\n// API REQUEST/RESPONSE TYPES\n// ============================================================================\n\nexport interface PaginationParams {\n  page?: number;\n  limit?: number;\n}\n\nexport interface PaginatedResponse<T> {\n  data: T[];\n  pagination: {\n    total: number;\n    pages: number;\n    currentPage: number;\n    perPage: number;\n  };\n}\n\nexport interface ApiErrorResponse {\n  error: string;\n  message?: string;\n  details?: Record<string, any>;\n}\n\n// ============================================================================\n// INPUT TYPES\n// ============================================================================\n\nexport interface CreateSubscriptionInput {\n  customerId: string;\n  priceId: string;\n  quantity?: number;\n  trialEnd?: string;\n  metadata?: Record<string, any>;\n}\n\nexport interface UpdateSubscriptionInput {\n  priceId?: string;\n  quantity?: number;\n  entitlementOverrides?: Record<string, string>;\n  cancelAtPeriodEnd?: boolean;\n  metadata?: Record<string, any>;\n}\n\nexport interface ProrationDetails {\n  credit: string;\n  charge: string;\n  net: string;\n  currency: string;\n}\n\nexport interface PreviewUpdateResponse {\n  proration: ProrationDetails;\n  effectiveDate: string;\n  newPriceId: string;\n  newQuantity: number;\n}\n\nexport interface CreateSubscriptionResult {\n  subscription: Subscription;\n  requiresPayment: boolean;\n  clientSecret?: string;\n  paymentUrl?: string; // Absolute payment URL from backend\n  iframeId?: string;\n  provider?: PaymentProvider;\n  invoiceId?: string;\n  paymentId?: string;\n  paymentLinkId?: string;\n  error?: string;\n}\n\n// ============================================================================\n// PAYMENT LINK TYPES\n// ============================================================================\n\nexport type PaymentMode = 'new-window' | 'redirect' | 'iframe';\n\nexport interface SubscriptionPaymentLinkWithDetails {\n  id: string;\n  token: string;\n  subscriptionId: string;\n  expiresAt: string;\n  isUsed: boolean;\n  usedAt?: string;\n  createdAt: string;\n  updatedAt: string;\n  paymentUrl?: string; // Absolute payment URL from backend\n  subscription?: any; // SubscriptionWithRelations\n  invoice?: any; // Invoice\n}\n\nexport interface OneTimePaymentLinkWithDetails {\n  id: string;\n  tenantId: string;\n  customerId: string;\n  name: string;\n  description?: string;\n  amount: string;\n  currency: string;\n  token: string;\n  expiresAt: string;\n  isUsed: boolean;\n  usedAt?: string;\n  paymentId?: string;\n  paymentUrl?: string; // Absolute payment URL from backend\n  metadata?: Record<string, any>;\n  createdAt: string;\n  updatedAt: string;\n  customer?: any; // Customer\n  payment?: any; // Payment\n}\n\nexport interface PaymentLinkSummary {\n  count: number;\n  totalAmount: number;\n  currency: string;\n  links: (SubscriptionPaymentLinkWithDetails | OneTimePaymentLinkWithDetails)[];\n}\n\nexport interface PaymentUrlReadyEvent {\n  paymentUrl: string;\n  iframeId?: string;\n  subscriptionId?: string;\n  amount: number;\n  currency: string;\n}\n\nexport interface PaymentCompletedEvent {\n  token: string;\n  success: boolean;\n  subscriptionId?: string;\n}\n\n\nexport interface RecordUsageInput {\n  meterId: string;\n  subscriptionId?: string;\n  customerId: string;\n  eventName: string;\n  properties: Record<string, any>;\n  value?: number;\n  timestamp?: string;\n}\n\nexport interface ListSubscriptionsParams extends PaginationParams {\n  customerId?: string;\n  status?: SubscriptionStatus | SubscriptionStatus[];\n  priceId?: string;\n  productId?: string;\n}\n\nexport interface ListInvoicesParams extends PaginationParams {\n  customerId?: string;\n  subscriptionId?: string;\n  status?: InvoiceStatus | InvoiceStatus[];\n  dateFrom?: string;\n  dateTo?: string;\n}\n\nexport interface ListProductsParams extends PaginationParams {\n  countryCode?: string;\n  isActive?: boolean;\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, map, switchMap, of, catchError } from 'rxjs';\nimport { SubtrakService } from './subtrak.service';\nimport {\n  Subscription,\n  SubscriptionWithRelations,\n  SubscriptionStatus,\n  CreateSubscriptionInput,\n  CreateSubscriptionResult,\n  UpdateSubscriptionInput,\n  ListSubscriptionsParams,\n  PaginatedResponse,\n  PriceWithEntitlements,\n  EntitlementValue,\n  PlanOption,\n  Customer,\n  PreviewUpdateResponse\n} from '../models';\n\n/**\n * Service for managing customer subscriptions\n *\n * @example\n * ```typescript\n * constructor(private subscriptions: SubscriptionsService) {}\n *\n * // Get current subscription\n * this.subscriptions.getCurrentSubscription('cus_123').subscribe(sub => {\n *   console.log('Current plan:', sub.price.nickname);\n * });\n *\n * // Create subscription\n * this.subscriptions.createSubscription({\n *   customerId: 'cus_123',\n *   priceId: 'price_456',\n *   quantity: 1\n * }).subscribe();\n * ```\n */\n@Injectable()\nexport class SubscriptionsService {\n  constructor(private subtrak: SubtrakService) { }\n\n  /**\n   * Get the current active subscription for a customer\n   *\n   * @param customerId - Customer ID\n   * @returns Observable of the active subscription\n   */\n  getCurrentSubscription(customerId: string): Observable<SubscriptionWithRelations> {\n    return this.listSubscriptions({ customerId, status: SubscriptionStatus.ACTIVE }).pipe(\n      map(response => {\n        if (response.data.length === 0) {\n          throw new Error('No active subscription found');\n        }\n        return response.data[0] as SubscriptionWithRelations;\n      })\n    );\n  }\n\n  /**\n   * List all subscriptions with optional filtering\n   *\n   * @param params - Query parameters for filtering\n   * @returns Observable of paginated subscriptions\n   */\n  listSubscriptions(params?: ListSubscriptionsParams): Observable<PaginatedResponse<SubscriptionWithRelations>> {\n    return this.subtrak.get<PaginatedResponse<SubscriptionWithRelations>>('subscriptions', params);\n  }\n\n  /**\n   * Get a specific subscription by ID\n   *\n   * @param subscriptionId - Subscription ID\n   * @returns Observable of the subscription\n   */\n  getSubscription(subscriptionId: string): Observable<SubscriptionWithRelations> {\n    return this.subtrak.get<SubscriptionWithRelations>(`subscriptions/${subscriptionId}`);\n  }\n\n  /**\n   * List available plans (prices) for a country\n   *\n   * @param countryCode - ISO country code (e.g., 'US', 'EG')\n   * @returns Observable of available prices with entitlements\n   */\n  listAvailablePlans(countryCode?: string): Observable<PriceWithEntitlements[]> {\n    const params: any = { isActive: true };\n    if (countryCode) {\n      params.countryCode = countryCode;\n    }\n\n    return this.subtrak.get<PaginatedResponse<PriceWithEntitlements>>('prices', params).pipe(\n      map(response => response.data)\n    );\n  }\n\n  /**\n   * Get prices for a specific product (no grouping)\n   * Uses the /products/:id/prices endpoint with automatic country fallback.\n   * Free plans are always sorted to the beginning of the array.\n   *\n   * @param productId - Product ID (required)\n   * @param countryCode - ISO country code (e.g., 'US', 'EG'). Optional.\n   * @returns Observable of PriceWithEntitlements[] (free plans first)\n   *\n   * @example\n   * ```typescript\n   * // Get all prices for a product in Egypt\n   * this.subscriptions.getProductPrices('prod_123', 'EG').subscribe(prices => {\n   *   console.log('First price (free plan):', prices[0]);\n   *   console.log('All prices:', prices);\n   * });\n   * ```\n   */\n  getProductPrices(productId: string, countryCode?: string): Observable<PriceWithEntitlements[]> {\n    const params = countryCode ? { countryCode } : undefined;\n\n    return this.subtrak.get<PriceWithEntitlements[]>(`products/${productId}/prices`, params).pipe(\n      map(prices => {\n        // Sort to ensure free plans are always at index 0\n        return prices.sort((a, b) => {\n          // Free plans first\n          if (a.isFreePlan && !b.isFreePlan) return -1;\n          if (!a.isFreePlan && b.isFreePlan) return 1;\n\n          // Then sort by billing interval (monthly before yearly)\n          const intervalOrder: Record<string, number> = {\n            'DAILY': 1,\n            'WEEKLY': 2,\n            'MONTHLY': 3,\n            'QUARTERLY': 4,\n            'ANNUAL': 5,\n            'YEARLY': 5\n          };\n\n          const aInterval = intervalOrder[a.billingInterval || ''] || 999;\n          const bInterval = intervalOrder[b.billingInterval || ''] || 999;\n\n          if (aInterval !== bInterval) {\n            return aInterval - bInterval;\n          }\n\n          // Finally sort by price (ascending)\n          const aAmount = parseFloat(a.unitAmount || '0');\n          const bAmount = parseFloat(b.unitAmount || '0');\n          return aAmount - bAmount;\n        });\n      })\n    );\n  }\n\n  /**\n   * Get plans grouped by nickname (Plan Options) for a specific customer.\n   * Resolves the customer's country and fetches relevant prices.\n   *\n   * @param customerId - Customer ID (optional)\n   * @param productId - Product ID (optional, to filter plans by product)\n   * @returns Observable of PlanOption[]\n   */\n  getPlansForCustomer(customerId?: string | null, productId?: string, countryCode?: string): Observable<PlanOption[]> {\n    const country$ = countryCode\n      ? of(countryCode)\n      : (customerId\n        ? this.subtrak.get<Customer>(`customers/${customerId}`).pipe(\n          map(c => c.countryCode),\n          catchError(err => {\n            console.error('Failed to fetch customer for plans', err);\n            return of(undefined);\n          })\n        )\n        : of(undefined));\n\n    return country$.pipe(\n      switchMap(code => this.listAvailablePlans(code).pipe(\n        switchMap(prices => {\n          // Check if we have any plans for the requested product\n          const filtered = productId ? prices.filter(p => p.productId === productId) : prices;\n\n          // If no plans found and country isn't already US, fallback to US\n          if (filtered.length === 0 && code !== 'US') {\n            return this.listAvailablePlans('US');\n          }\n          return of(prices);\n        })\n      )),\n      map(prices => {\n        // Filter by productId if provided\n        const filtered = productId ? prices.filter(p => p.productId === productId) : prices;\n\n        // Group by nickname\n        const groups: Record<string, PriceWithEntitlements[]> = {};\n        filtered.forEach(p => {\n          if (!p.isActive) return;\n          const key = p.nickname || \"Standard\";\n          if (!groups[key]) groups[key] = [];\n          groups[key].push(p);\n        });\n\n        return Object.entries(groups).map(([name, priceList]) => ({\n          name,\n          prices: priceList,\n          description: priceList.find(p => p.description)?.description || null\n        }));\n      })\n    );\n  }\n\n  /**\n   * Create a new subscription\n   *\n   * For Paymob customers, the response includes payment intent details.\n   * The frontend should check `requiresPayment` and display the payment iframe if true.\n   *\n   * @param input - Subscription creation data\n   * @returns Observable of CreateSubscriptionResult containing:\n   *   - subscription: The created subscription (status PENDING for Paymob)\n   *   - requiresPayment: true if payment iframe needed (Paymob)\n   *   - clientSecret: Paymob payment intent client_secret\n   *   - paymentUrl: Paymob iframe URL to display\n   *   - iframeId: Paymob iframe ID\n   *   - provider: Payment provider (STRIPE, PAYMOB_EGYPT, etc.)\n   *\n   * @example\n   * ```typescript\n   * // Create subscription\n   * this.subscriptions.createSubscription({\n   *   customerId: 'cus_123',\n   *   priceId: 'price_456'\n   * }).subscribe(result => {\n   *   if (result.requiresPayment && result.paymentUrl) {\n   *     // Display Paymob payment iframe\n   *     window.open(result.paymentUrl, '_blank');\n   *   } else {\n   *     // Subscription activated immediately (Stripe or free plan)\n   *     console.log('Subscription active:', result.subscription.id);\n   *   }\n   * });\n   * ```\n   */\n  createSubscription(input: CreateSubscriptionInput): Observable<CreateSubscriptionResult> {\n    return this.subtrak.post<CreateSubscriptionResult>('subscriptions', input);\n  }\n\n  /**\n   * Preview a subscription update (proration calculation)\n   *\n   * @param subscriptionId - Subscription ID\n   * @param input - Update data (price, quantity, overrides)\n   * @returns Observable of proration details\n   */\n  previewUpdate(subscriptionId: string, input: Partial<UpdateSubscriptionInput>): Observable<PreviewUpdateResponse> {\n    return this.subtrak.post<PreviewUpdateResponse>(`subscriptions/${subscriptionId}/preview-update`, input);\n  }\n\n  /**\n   * Update an existing subscription\n   *\n   * @param subscriptionId - Subscription ID\n   * @param input - Update data\n   * @returns Observable of the updated subscription\n   */\n  updateSubscription(subscriptionId: string, input: UpdateSubscriptionInput): Observable<Subscription> {\n    return this.subtrak.put<Subscription>(`subscriptions/${subscriptionId}`, input);\n  }\n\n  /**\n   * Upgrade a subscription to a higher-tier plan\n   *\n   * @param subscriptionId - Subscription ID\n   * @param newPriceId - New price ID to upgrade to\n   * @returns Observable of the updated subscription\n   */\n  upgradeSubscription(subscriptionId: string, newPriceId: string): Observable<Subscription> {\n    return this.updateSubscription(subscriptionId, {\n      priceId: newPriceId\n    });\n  }\n\n  /**\n   * Downgrade a subscription to a lower-tier plan\n   *\n   * @param subscriptionId - Subscription ID\n   * @param newPriceId - New price ID to downgrade to\n   * @returns Observable of the updated subscription\n   */\n  downgradeSubscription(subscriptionId: string, newPriceId: string): Observable<Subscription> {\n    return this.updateSubscription(subscriptionId, {\n      priceId: newPriceId\n    });\n  }\n\n  /**\n   * Change subscription quantity\n   *\n   * @param subscriptionId - Subscription ID\n   * @param quantity - New quantity\n   * @returns Observable of the updated subscription\n   */\n  changeQuantity(subscriptionId: string, quantity: number): Observable<Subscription> {\n    return this.updateSubscription(subscriptionId, { quantity });\n  }\n\n  /**\n   * Cancel a subscription\n   *\n   * @param subscriptionId - Subscription ID\n   * @param options - Cancellation options\n   * @returns Observable of void\n   */\n  cancelSubscription(\n    subscriptionId: string,\n    options: { immediately?: boolean } = {}\n  ): Observable<void> {\n    if (options.immediately) {\n      return this.subtrak.delete<void>(`subscriptions/${subscriptionId}`);\n    } else {\n      return this.updateSubscription(subscriptionId, {\n        cancelAtPeriodEnd: true\n      }).pipe(map(() => undefined));\n    }\n  }\n\n  /**\n   * Reactivate a cancelled subscription\n   *\n   * @param subscriptionId - Subscription ID\n   * @returns Observable of the reactivated subscription\n   */\n  reactivateSubscription(subscriptionId: string): Observable<Subscription> {\n    return this.updateSubscription(subscriptionId, {\n      cancelAtPeriodEnd: false\n    });\n  }\n\n  /**\n   * Pause a subscription\n   *\n   * @param subscriptionId - Subscription ID\n   * @returns Observable of the paused subscription\n   */\n  pauseSubscription(subscriptionId: string): Observable<Subscription> {\n    return this.subtrak.post<Subscription>(`subscriptions/${subscriptionId}/pause`, {});\n  }\n\n  /**\n   * Resume a paused subscription\n   *\n   * @param subscriptionId - Subscription ID\n   * @returns Observable of the resumed subscription\n   */\n  resumeSubscription(subscriptionId: string): Observable<Subscription> {\n    return this.subtrak.post<Subscription>(`subscriptions/${subscriptionId}/resume`, {});\n  }\n\n  /**\n   * Get entitlements for a subscription\n   *\n   * @param subscriptionId - Subscription ID\n   * @returns Observable of entitlement values\n   */\n  getEntitlements(subscriptionId: string): Observable<EntitlementValue[]> {\n    return this.subtrak.get<EntitlementValue[]>(`subscriptions/${subscriptionId}/entitlements`);\n  }\n\n  /**\n   * Get usage summary for a subscription\n   *\n   * @param subscriptionId - Subscription ID\n   * @returns Observable of usage data\n   */\n  getUsage(subscriptionId: string): Observable<any> {\n    return this.subtrak.get(`subscriptions/${subscriptionId}/usage`);\n  }\n}\n","import { EntitlementValue, EntitlementType } from '../models';\n\n/**\n * Utility class for type-safe entitlement checking\n */\nexport class EntitlementChecker {\n  constructor(private entitlements: EntitlementValue[]) {}\n\n  /**\n   * Find an entitlement by code\n   */\n  private findEntitlement(code: string): EntitlementValue | undefined {\n    return this.entitlements.find(e => e.code === code);\n  }\n\n  /**\n   * Check if a BOOLEAN feature is enabled\n   * @returns true if feature exists and is enabled, false otherwise\n   */\n  hasFeature(code: string): boolean {\n    const entitlement = this.findEntitlement(code);\n    if (!entitlement || entitlement.type !== EntitlementType.BOOLEAN) {\n      return false;\n    }\n    return entitlement.value === true;\n  }\n\n  /**\n   * Get a NUMERIC limit value\n   * @returns The numeric limit, or null if not found\n   */\n  getLimit(code: string): number | null {\n    const entitlement = this.findEntitlement(code);\n    if (!entitlement || entitlement.type !== EntitlementType.NUMERIC) {\n      return null;\n    }\n    return typeof entitlement.value === 'number' ? entitlement.value : null;\n  }\n\n  /**\n   * Get an ENUM value\n   * @returns The enum string value, or null if not found\n   */\n  getEnumValue(code: string): string | null {\n    const entitlement = this.findEntitlement(code);\n    if (!entitlement || entitlement.type !== EntitlementType.ENUM) {\n      return null;\n    }\n    return typeof entitlement.value === 'string' ? entitlement.value : null;\n  }\n\n  /**\n   * Check if current usage is within a NUMERIC limit\n   * @param code Entitlement code\n   * @param currentUsage Current usage value\n   * @returns true if within limit, false if exceeded or unlimited (-1)\n   */\n  isWithinLimit(code: string, currentUsage: number): boolean {\n    const limit = this.getLimit(code);\n    if (limit === null) return false;\n    if (limit === -1) return true; // Unlimited\n    return currentUsage < limit;\n  }\n\n  /**\n   * Get remaining quota for a NUMERIC limit\n   * @param code Entitlement code\n   * @param used Currently used amount\n   * @returns Remaining quota, or -1 for unlimited, or null if not found\n   */\n  getRemainingQuota(code: string, used: number): number | null {\n    const limit = this.getLimit(code);\n    if (limit === null) return null;\n    if (limit === -1) return -1; // Unlimited\n    return Math.max(0, limit - used);\n  }\n\n  /**\n   * Get usage progress as a percentage (0-100)\n   * @param code Entitlement code\n   * @param used Currently used amount\n   * @returns Progress percentage, or null if not found, or -1 for unlimited\n   */\n  getProgress(code: string, used: number): number | null {\n    const limit = this.getLimit(code);\n    if (limit === null) return null;\n    if (limit === -1) return -1; // Unlimited\n    if (limit === 0) return 100; // Edge case\n    return Math.min(100, (used / limit) * 100);\n  }\n\n  /**\n   * Check if approaching limit (default threshold: 90%)\n   * @param code Entitlement code\n   * @param used Currently used amount\n   * @param threshold Warning threshold (0-1), default 0.9\n   * @returns true if approaching or at limit\n   */\n  isApproachingLimit(code: string, used: number, threshold: number = 0.9): boolean {\n    const progress = this.getProgress(code, used);\n    if (progress === null || progress === -1) return false;\n    return progress >= threshold * 100;\n  }\n\n  /**\n   * Generic access check supporting all entitlement types\n   * @param code Entitlement code\n   * @param requiredValue Optional value to check against (for NUMERIC/ENUM)\n   * @returns true if access is granted\n   */\n  checkAccess(code: string, requiredValue?: any): boolean {\n    const entitlement = this.findEntitlement(code);\n    if (!entitlement) return false;\n\n    switch (entitlement.type) {\n      case EntitlementType.BOOLEAN:\n        return entitlement.value === true;\n\n      case EntitlementType.NUMERIC:\n        if (requiredValue === undefined) {\n          return entitlement.value !== null && entitlement.value !== 0;\n        }\n        const limit = entitlement.value as number;\n        if (limit === -1) return true; // Unlimited\n        return requiredValue < limit;\n\n      case EntitlementType.ENUM:\n        if (requiredValue === undefined) {\n          return entitlement.value !== null;\n        }\n        return entitlement.value === requiredValue;\n\n      case EntitlementType.METERED:\n        // For metered entitlements, just check if it exists\n        return entitlement.value !== null;\n\n      default:\n        return false;\n    }\n  }\n\n  /**\n   * Get formatted display value for an entitlement\n   * @param code Entitlement code\n   * @returns Formatted string for display\n   */\n  getDisplayValue(code: string): string | null {\n    const entitlement = this.findEntitlement(code);\n    if (!entitlement) return null;\n\n    switch (entitlement.type) {\n      case EntitlementType.BOOLEAN:\n        return entitlement.value === true ? 'Enabled' : 'Disabled';\n\n      case EntitlementType.NUMERIC:\n        const value = entitlement.value as number;\n        if (value === -1) return 'Unlimited';\n        const unit = entitlement.unit ? ` ${entitlement.unit}` : '';\n        return `${value.toLocaleString()}${unit}`;\n\n      case EntitlementType.ENUM:\n        return entitlement.value as string;\n\n      case EntitlementType.METERED:\n        return 'Metered';\n\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Get all active features (BOOLEAN entitlements that are true)\n   * @returns Array of feature codes\n   */\n  getActiveFeatures(): string[] {\n    return this.entitlements\n      .filter(e => e.type === EntitlementType.BOOLEAN && e.value === true)\n      .map(e => e.code);\n  }\n\n  /**\n   * Get all limits (NUMERIC entitlements)\n   * @returns Map of code to limit value\n   */\n  getLimits(): Record<string, number> {\n    return this.entitlements\n      .filter(e => e.type === EntitlementType.NUMERIC)\n      .reduce((acc, e) => {\n        acc[e.code] = e.value as number;\n        return acc;\n      }, {} as Record<string, number>);\n  }\n}\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map } from 'rxjs';\r\nimport { SubtrakService } from './subtrak.service';\r\nimport { EntitlementValue, EntitlementType } from '../models';\r\nimport { EntitlementChecker } from '../utils/entitlement-checker';\r\n\r\n/**\r\n * Service for checking customer entitlements\r\n *\r\n * Handles all entitlement types: BOOLEAN, NUMERIC, ENUM, METERED\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private entitlements: EntitlementsService) {}\r\n *\r\n * // Check if customer has a feature\r\n * this.entitlements.hasFeature('cus_123', 'premium_analytics').subscribe(hasAccess => {\r\n *   if (hasAccess) {\r\n *     // Show premium features\r\n *   }\r\n * });\r\n *\r\n * // Get numeric limit\r\n * this.entitlements.getLimit('cus_123', 'max_projects').subscribe(limit => {\r\n *   console.log('Project limit:', limit);\r\n * });\r\n * ```\r\n */\r\n@Injectable()\r\nexport class EntitlementsService {\r\n  constructor(private subtrak: SubtrakService) {}\r\n\r\n  /**\r\n   * Get all entitlements for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of entitlement values\r\n   */\r\n  getEntitlements(customerId: string): Observable<EntitlementValue[]> {\r\n    return this.subtrak.get<{ entitlements: EntitlementValue[] }>(`customers/${customerId}/entitlements`).pipe(\r\n      map(response => response.entitlements)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Check if customer has a BOOLEAN feature\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @returns Observable of boolean indicating if feature is enabled\r\n   */\r\n  hasFeature(customerId: string, code: string): Observable<boolean> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.hasFeature(code);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get NUMERIC limit value\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @returns Observable of the limit value (or null if not found)\r\n   */\r\n  getLimit(customerId: string, code: string): Observable<number | null> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.getLimit(code);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get ENUM value\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @returns Observable of the enum string value (or null if not found)\r\n   */\r\n  getEnumValue(customerId: string, code: string): Observable<string | null> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.getEnumValue(code);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Check access with multi-type support\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @param requiredValue - Optional value to check against\r\n   * @returns Observable of boolean indicating if access is granted\r\n   */\r\n  checkAccess(customerId: string, code: string, requiredValue?: any): Observable<boolean> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.checkAccess(code, requiredValue);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Check if current usage is within a NUMERIC limit\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @param currentUsage - Current usage value\r\n   * @returns Observable of boolean indicating if within limit\r\n   */\r\n  isWithinLimit(customerId: string, code: string, currentUsage: number): Observable<boolean> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.isWithinLimit(code, currentUsage);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get remaining quota for a NUMERIC limit\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @param used - Currently used amount\r\n   * @returns Observable of remaining quota (or -1 for unlimited, null if not found)\r\n   */\r\n  getRemainingQuota(customerId: string, code: string, used: number): Observable<number | null> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.getRemainingQuota(code, used);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get usage progress percentage (0-100)\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @param used - Currently used amount\r\n   * @returns Observable of progress percentage (or -1 for unlimited, null if not found)\r\n   */\r\n  getProgress(customerId: string, code: string, used: number): Observable<number | null> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.getProgress(code, used);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Check if approaching limit (default: 90% threshold)\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @param used - Currently used amount\r\n   * @param threshold - Warning threshold (0-1), default 0.9\r\n   * @returns Observable of boolean indicating if approaching limit\r\n   */\r\n  isApproachingLimit(\r\n    customerId: string,\r\n    code: string,\r\n    used: number,\r\n    threshold: number = 0.9\r\n  ): Observable<boolean> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.isApproachingLimit(code, used, threshold);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get formatted display value for an entitlement\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param code - Entitlement code\r\n   * @returns Observable of formatted string for display\r\n   */\r\n  getDisplayValue(customerId: string, code: string): Observable<string | null> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.getDisplayValue(code);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get all active BOOLEAN features\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of array of feature codes\r\n   */\r\n  getActiveFeatures(customerId: string): Observable<string[]> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.getActiveFeatures();\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get all NUMERIC limits as a map\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of map of code to limit value\r\n   */\r\n  getLimits(customerId: string): Observable<Record<string, number>> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => {\r\n        const checker = new EntitlementChecker(entitlements);\r\n        return checker.getLimits();\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Create an EntitlementChecker instance from customer entitlements\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of EntitlementChecker instance\r\n   */\r\n  getChecker(customerId: string): Observable<EntitlementChecker> {\r\n    return this.getEntitlements(customerId).pipe(\r\n      map(entitlements => new EntitlementChecker(entitlements))\r\n    );\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map } from 'rxjs';\r\nimport { SubtrakService } from './subtrak.service';\r\nimport { RecordUsageInput, UsageSummary, PaginatedResponse } from '../models';\r\n\r\n/**\r\n * Service for tracking and recording metered usage\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private usage: UsageService) {}\r\n *\r\n * // Record single usage event\r\n * this.usage.recordUsage({\r\n *   meterId: 'meter_api_calls',\r\n *   customerId: 'cus_123',\r\n *   eventName: 'api_call',\r\n *   properties: { endpoint: '/api/data', method: 'GET' },\r\n *   value: 1\r\n * }).subscribe();\r\n *\r\n * // Get current usage\r\n * this.usage.getCurrentUsage('meter_api_calls', 'cus_123').subscribe(summary => {\r\n *   console.log('Total usage:', summary.totalUsage);\r\n * });\r\n * ```\r\n */\r\n@Injectable()\r\nexport class UsageService {\r\n  constructor(private subtrak: SubtrakService) {}\r\n\r\n  /**\r\n   * Record a single usage event\r\n   *\r\n   * @param input - Usage event data\r\n   * @returns Observable of void\r\n   */\r\n  recordUsage(input: RecordUsageInput): Observable<void> {\r\n    return this.subtrak.post<void>('usage', input);\r\n  }\r\n\r\n  /**\r\n   * Record multiple usage events in a single request\r\n   *\r\n   * @param events - Array of usage event data\r\n   * @returns Observable of void\r\n   */\r\n  batchRecordUsage(events: RecordUsageInput[]): Observable<void> {\r\n    return this.subtrak.post<void>('usage/batch', { events });\r\n  }\r\n\r\n  /**\r\n   * Get current usage summary for a meter and customer\r\n   *\r\n   * @param meterId - Meter ID\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of usage summary\r\n   */\r\n  getCurrentUsage(meterId: string, customerId: string): Observable<UsageSummary> {\r\n    return this.subtrak.get<UsageSummary>('usage/summary', {\r\n      meterId,\r\n      customerId,\r\n      current: true\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get usage history for a meter\r\n   *\r\n   * @param params - Query parameters\r\n   * @returns Observable of usage summaries\r\n   */\r\n  getUsageHistory(params: {\r\n    meterId?: string;\r\n    customerId?: string;\r\n    subscriptionId?: string;\r\n    periodStart?: string;\r\n    periodEnd?: string;\r\n    page?: number;\r\n    limit?: number;\r\n  }): Observable<PaginatedResponse<UsageSummary>> {\r\n    return this.subtrak.get<PaginatedResponse<UsageSummary>>('usage/history', params);\r\n  }\r\n\r\n  /**\r\n   * Get usage summary by subscription\r\n   *\r\n   * @param subscriptionId - Subscription ID\r\n   * @returns Observable of usage summaries\r\n   */\r\n  getSubscriptionUsage(subscriptionId: string): Observable<UsageSummary[]> {\r\n    return this.getUsageHistory({ subscriptionId }).pipe(\r\n      map(response => response.data)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get usage for a specific meter and subscription\r\n   *\r\n   * @param meterId - Meter ID\r\n   * @param subscriptionId - Subscription ID\r\n   * @returns Observable of usage summary\r\n   */\r\n  getMeterUsage(meterId: string, subscriptionId: string): Observable<UsageSummary> {\r\n    return this.getUsageHistory({ meterId, subscriptionId }).pipe(\r\n      map(response => {\r\n        if (response.data.length === 0) {\r\n          throw new Error('No usage data found');\r\n        }\r\n        return response.data[0];\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Helper method to track API calls\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param endpoint - API endpoint called\r\n   * @param method - HTTP method\r\n   * @param metadata - Additional metadata\r\n   * @returns Observable of void\r\n   */\r\n  trackApiCall(\r\n    customerId: string,\r\n    endpoint: string,\r\n    method: string = 'GET',\r\n    metadata?: Record<string, any>\r\n  ): Observable<void> {\r\n    return this.recordUsage({\r\n      meterId: 'meter_api_calls',\r\n      customerId,\r\n      eventName: 'api_call',\r\n      properties: {\r\n        endpoint,\r\n        method,\r\n        ...metadata\r\n      },\r\n      value: 1\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Helper method to track data exports\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param format - Export format (csv, json, etc.)\r\n   * @param rowCount - Number of rows exported\r\n   * @param metadata - Additional metadata\r\n   * @returns Observable of void\r\n   */\r\n  trackDataExport(\r\n    customerId: string,\r\n    format: string,\r\n    rowCount: number,\r\n    metadata?: Record<string, any>\r\n  ): Observable<void> {\r\n    return this.recordUsage({\r\n      meterId: 'meter_data_export',\r\n      customerId,\r\n      eventName: 'data_export',\r\n      properties: {\r\n        format,\r\n        rowCount,\r\n        ...metadata\r\n      },\r\n      value: rowCount\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Helper method to track storage usage\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param sizeBytes - Size in bytes\r\n   * @param fileType - Type of file\r\n   * @param metadata - Additional metadata\r\n   * @returns Observable of void\r\n   */\r\n  trackStorageUsage(\r\n    customerId: string,\r\n    sizeBytes: number,\r\n    fileType: string,\r\n    metadata?: Record<string, any>\r\n  ): Observable<void> {\r\n    return this.recordUsage({\r\n      meterId: 'meter_storage',\r\n      customerId,\r\n      eventName: 'storage_used',\r\n      properties: {\r\n        sizeBytes,\r\n        sizeMb: (sizeBytes / (1024 * 1024)).toFixed(2),\r\n        fileType,\r\n        ...metadata\r\n      },\r\n      value: sizeBytes\r\n    });\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map } from 'rxjs';\r\nimport { SubtrakService } from './subtrak.service';\r\nimport { PaymentMethod, PaginatedResponse } from '../models';\r\n\r\n/**\r\n * Service for managing customer payment methods\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private paymentMethods: PaymentMethodsService) {}\r\n *\r\n * // List payment methods\r\n * this.paymentMethods.listPaymentMethods('cus_123').subscribe(methods => {\r\n *   console.log('Payment methods:', methods);\r\n * });\r\n *\r\n * // Add payment method (after Stripe tokenization)\r\n * this.paymentMethods.addPaymentMethod('cus_123', 'pm_stripe_token').subscribe();\r\n *\r\n * // Set default\r\n * this.paymentMethods.setDefaultPaymentMethod('pm_123').subscribe();\r\n * ```\r\n */\r\n@Injectable()\r\nexport class PaymentMethodsService {\r\n  constructor(private subtrak: SubtrakService) { }\r\n\r\n  /**\r\n   * List all payment methods for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of payment methods array\r\n   */\r\n  listPaymentMethods(customerId: string): Observable<PaymentMethod[]> {\r\n    return this.subtrak.get<PaginatedResponse<PaymentMethod> | PaymentMethod[]>('payment-methods', {\r\n      customerId\r\n    }).pipe(\r\n      map(response => {\r\n        // Handle both array response and paginated response\r\n        if (Array.isArray(response)) {\r\n          return response;\r\n        }\r\n        return response.data;\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get a specific payment method by ID\r\n   *\r\n   * @param paymentMethodId - Payment method ID\r\n   * @returns Observable of the payment method\r\n   */\r\n  getPaymentMethod(paymentMethodId: string): Observable<PaymentMethod> {\r\n    return this.subtrak.get<PaymentMethod>(`payment-methods/${paymentMethodId}`);\r\n  }\r\n\r\n  /**\r\n   * Add a new payment method for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param paymentMethodToken - Payment method token from provider (Stripe, Paymob)\r\n   * @param setAsDefault - Whether to set as default payment method\r\n   * @returns Observable of the created payment method\r\n   */\r\n  addPaymentMethod(\r\n    customerId: string,\r\n    provider: string,\r\n    providerMethodId: string,\r\n    type: string,\r\n    setAsDefault: boolean = false\r\n  ): Observable<PaymentMethod> {\r\n    return this.subtrak.post<PaymentMethod>('payment-methods', {\r\n      customerId,\r\n      provider,\r\n      providerMethodId, // This will be converted to provider_method_id by SubtrakService\r\n      type,\r\n      setAsDefault\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Set a payment method as the default\r\n   *\r\n   * @param paymentMethodId - Payment method ID\r\n   * @returns Observable of void\r\n   */\r\n  setDefaultPaymentMethod(paymentMethodId: string): Observable<void> {\r\n    return this.subtrak.put<void>(`payment-methods/${paymentMethodId}/set-default`, {});\r\n  }\r\n\r\n  /**\r\n   * Remove a payment method\r\n   *\r\n   * @param paymentMethodId - Payment method ID\r\n   * @returns Observable of void\r\n   */\r\n  removePaymentMethod(paymentMethodId: string): Observable<void> {\r\n    return this.subtrak.delete<void>(`payment-methods/${paymentMethodId}`);\r\n  }\r\n\r\n  /**\r\n   * Get the default payment method for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of the default payment method (or null if none)\r\n   */\r\n  getDefaultPaymentMethod(customerId: string): Observable<PaymentMethod | null> {\r\n    return this.listPaymentMethods(customerId).pipe(\r\n      map(methods => {\r\n        const defaultMethod = methods.find(m => m.isDefault);\r\n        return defaultMethod || null;\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Check if customer has any payment methods\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of boolean\r\n   */\r\n  hasPaymentMethod(customerId: string): Observable<boolean> {\r\n    return this.listPaymentMethods(customerId).pipe(\r\n      map(methods => methods.length > 0)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get payment method count for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of count\r\n   */\r\n  getPaymentMethodCount(customerId: string): Observable<number> {\r\n    return this.listPaymentMethods(customerId).pipe(\r\n      map(methods => methods.length)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get Stripe publishable key for adding payment methods\r\n   *\r\n   * This is needed to initialize Stripe Elements on the frontend\r\n   *\r\n   * @returns Observable of Stripe publishable key\r\n   */\r\n  getStripePublishableKey(): Observable<string> {\r\n    return this.subtrak.get<{ publishableKey: string }>('payment-providers/stripe/publishable-key').pipe(\r\n      map(response => response.publishableKey)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get Paymob public key for adding payment methods\r\n   *\r\n   * This is needed to initialize Paymob on the frontend\r\n   *\r\n   * @param country - Country code (EG, KSA, UAE, etc.)\r\n   * @returns Observable of Paymob public key\r\n   */\r\n  getPaymobPublicKey(country: string): Observable<string> {\r\n    return this.subtrak.get<{ publicKey: string }>(`payment-providers/paymob/public-key`, {\r\n      country\r\n    }).pipe(\r\n      map(response => response.publicKey)\r\n    );\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, map } from 'rxjs';\r\nimport { SubtrakService } from './subtrak.service';\r\nimport { Invoice, InvoiceWithRelations, ListInvoicesParams, PaginatedResponse, InvoiceStatus } from '../models';\r\n\r\n/**\r\n * Service for managing customer invoices\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private invoices: InvoicesService) {}\r\n *\r\n * // List invoices\r\n * this.invoices.listInvoices({ customerId: 'cus_123' }).subscribe(response => {\r\n *   console.log('Invoices:', response.data);\r\n * });\r\n *\r\n * // Download invoice PDF\r\n * this.invoices.downloadInvoicePdf('inv_123').subscribe(blob => {\r\n *   // Create download link\r\n *   const url = URL.createObjectURL(blob);\r\n *   const a = document.createElement('a');\r\n *   a.href = url;\r\n *   a.download = 'invoice.pdf';\r\n *   a.click();\r\n * });\r\n * ```\r\n */\r\n@Injectable()\r\nexport class InvoicesService {\r\n  constructor(private subtrak: SubtrakService) { }\r\n\r\n  /**\r\n   * List invoices with optional filtering\r\n   *\r\n   * @param params - Query parameters for filtering\r\n   * @returns Observable of paginated invoices\r\n   */\r\n  listInvoices(params?: ListInvoicesParams): Observable<PaginatedResponse<InvoiceWithRelations>> {\r\n    return this.subtrak.get<PaginatedResponse<InvoiceWithRelations>>('invoices', params);\r\n  }\r\n\r\n  /**\r\n   * Get a specific invoice by ID\r\n   *\r\n   * @param invoiceId - Invoice ID\r\n   * @returns Observable of the invoice\r\n   */\r\n  getInvoice(invoiceId: string): Observable<InvoiceWithRelations> {\r\n    return this.subtrak.get<InvoiceWithRelations>(`invoices/${invoiceId}`);\r\n  }\r\n\r\n  /**\r\n   * Get invoice PDF URL\r\n   *\r\n   * @param invoiceId - Invoice ID\r\n   * @returns Observable of PDF URL\r\n   */\r\n  getInvoicePdfUrl(invoiceId: string): Observable<string> {\r\n    return this.getInvoice(invoiceId).pipe(\r\n      map(invoice => {\r\n        if (!invoice.pdfUrl) {\r\n          throw new Error('Invoice PDF not available');\r\n        }\r\n        return invoice.pdfUrl;\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Download invoice as PDF blob\r\n   *\r\n   * @param invoiceId - Invoice ID\r\n   * @returns Observable of Blob\r\n   */\r\n  downloadInvoicePdf(invoiceId: string): Observable<Blob> {\r\n    return this.subtrak.get<Blob>(`invoices/${invoiceId}/download-pdf`, undefined, { responseType: 'blob' });\r\n  }\r\n\r\n  /**\r\n   * Send invoice via email\r\n   *\r\n   * @param invoiceId - Invoice ID\r\n   * @param email - Email address to send to (optional, defaults to customer email)\r\n   * @returns Observable of void\r\n   */\r\n  sendInvoiceEmail(invoiceId: string, email?: string): Observable<void> {\r\n    return this.subtrak.post<void>(`invoices/${invoiceId}/send`, {\r\n      email\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get invoices for a specific customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @param status - Optional status filter\r\n   * @returns Observable of invoices\r\n   */\r\n  getCustomerInvoices(customerId: string, status?: InvoiceStatus): Observable<Invoice[]> {\r\n    return this.listInvoices({ customerId, status }).pipe(\r\n      map(response => response.data)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get invoices for a specific subscription\r\n   *\r\n   * @param subscriptionId - Subscription ID\r\n   * @returns Observable of invoices\r\n   */\r\n  getSubscriptionInvoices(subscriptionId: string): Observable<Invoice[]> {\r\n    return this.listInvoices({ subscriptionId }).pipe(\r\n      map(response => response.data)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get paid invoices for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of paid invoices\r\n   */\r\n  getPaidInvoices(customerId: string): Observable<Invoice[]> {\r\n    return this.getCustomerInvoices(customerId, InvoiceStatus.PAID);\r\n  }\r\n\r\n  /**\r\n   * Get unpaid (open) invoices for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of open invoices\r\n   */\r\n  getUnpaidInvoices(customerId: string): Observable<Invoice[]> {\r\n    return this.getCustomerInvoices(customerId, InvoiceStatus.OPEN);\r\n  }\r\n\r\n  /**\r\n   * Get the latest invoice for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of the latest invoice\r\n   */\r\n  getLatestInvoice(customerId: string): Observable<Invoice> {\r\n    return this.listInvoices({ customerId, limit: 1 }).pipe(\r\n      map(response => {\r\n        if (response.data.length === 0) {\r\n          throw new Error('No invoices found');\r\n        }\r\n        return response.data[0];\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Calculate total amount paid by customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of total amount\r\n   */\r\n  getTotalPaid(customerId: string): Observable<number> {\r\n    return this.getPaidInvoices(customerId).pipe(\r\n      map(invoices => {\r\n        return invoices.reduce((sum, invoice) => {\r\n          return sum + parseFloat(invoice.amountPaid);\r\n        }, 0);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Calculate total outstanding amount for customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of total outstanding\r\n   */\r\n  getTotalOutstanding(customerId: string): Observable<number> {\r\n    return this.getUnpaidInvoices(customerId).pipe(\r\n      map(invoices => {\r\n        return invoices.reduce((sum, invoice) => {\r\n          return sum + parseFloat(invoice.amountDue);\r\n        }, 0);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Check if customer has any unpaid invoices\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of boolean\r\n   */\r\n  hasUnpaidInvoices(customerId: string): Observable<boolean> {\r\n    return this.getUnpaidInvoices(customerId).pipe(\r\n      map(invoices => invoices.length > 0)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get invoice count for a customer\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of count\r\n   */\r\n  getInvoiceCount(customerId: string): Observable<number> {\r\n    return this.listInvoices({ customerId, limit: 1 }).pipe(\r\n      map(response => response.pagination.total)\r\n    );\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, forkJoin, map } from 'rxjs';\r\nimport { SubtrakService } from './subtrak.service';\r\nimport {\r\n  SubscriptionPaymentLinkWithDetails,\r\n  OneTimePaymentLinkWithDetails,\r\n  PaymentLinkSummary,\r\n} from '../models';\r\n\r\n/**\r\n * Service for managing payment links\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private paymentLinks: PaymentLinksService) {}\r\n *\r\n * // Get all pending payment links for a customer\r\n * this.paymentLinks.getAllPendingPaymentLinks('cus_123').subscribe(summary => {\r\n *   console.log(`Customer has ${summary.count} unpaid invoice(s)`);\r\n *   console.log(`Total amount due: ${summary.totalAmount} ${summary.currency}`);\r\n * });\r\n * ```\r\n */\r\n@Injectable()\r\nexport class PaymentLinksService {\r\n  constructor(private subtrak: SubtrakService) {}\r\n\r\n  /**\r\n   * Get pending subscription payment links for a customer\r\n   * Returns only links that are not used and not expired\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of pending subscription payment links\r\n   */\r\n  getPendingSubscriptionPaymentLinks(customerId: string): Observable<SubscriptionPaymentLinkWithDetails[]> {\r\n    return this.subtrak.get<{ data: SubscriptionPaymentLinkWithDetails[] }>(\r\n      `payment-links/customer/${customerId}/pending`\r\n    ).pipe(\r\n      map(response => response.data)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get pending one-time payment links for a customer\r\n   * Returns only links that are not used and not expired\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of pending one-time payment links\r\n   */\r\n  getPendingOneTimePaymentLinks(customerId: string): Observable<OneTimePaymentLinkWithDetails[]> {\r\n    return this.subtrak.get<{ data: OneTimePaymentLinkWithDetails[] }>(\r\n      `one-time-payment-links/customer/${customerId}/pending`\r\n    ).pipe(\r\n      map(response => response.data)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get all pending payment links for a customer (both subscription and one-time)\r\n   * Returns a summary with total count and amount\r\n   *\r\n   * @param customerId - Customer ID\r\n   * @returns Observable of payment link summary\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * this.paymentLinks.getAllPendingPaymentLinks('cus_123').subscribe(summary => {\r\n   *   if (summary.count > 0) {\r\n   *     console.log(`You have ${summary.count} unpaid invoice(s)`);\r\n   *     console.log(`Total: ${summary.totalAmount} ${summary.currency}`);\r\n   *   }\r\n   * });\r\n   * ```\r\n   */\r\n  getAllPendingPaymentLinks(customerId: string): Observable<PaymentLinkSummary> {\r\n    return forkJoin({\r\n      subscriptionLinks: this.getPendingSubscriptionPaymentLinks(customerId),\r\n      oneTimeLinks: this.getPendingOneTimePaymentLinks(customerId),\r\n    }).pipe(\r\n      map(({ subscriptionLinks, oneTimeLinks }) => {\r\n        // Combine both types of links\r\n        const allLinks = [...subscriptionLinks, ...oneTimeLinks];\r\n\r\n        // Calculate total amount and determine primary currency\r\n        let totalAmount = 0;\r\n        const currencyMap = new Map<string, number>();\r\n\r\n        allLinks.forEach(link => {\r\n          const amount = parseFloat(\r\n            'amount' in link\r\n              ? link.amount\r\n              : (link.invoice?.total || '0')\r\n          );\r\n          const currency = 'currency' in link\r\n            ? link.currency\r\n            : (link.invoice?.currency || 'USD');\r\n\r\n          totalAmount += amount;\r\n          currencyMap.set(currency, (currencyMap.get(currency) || 0) + amount);\r\n        });\r\n\r\n        // Find the most common currency\r\n        let primaryCurrency = 'USD';\r\n        let maxAmount = 0;\r\n        currencyMap.forEach((amount, currency) => {\r\n          if (amount > maxAmount) {\r\n            maxAmount = amount;\r\n            primaryCurrency = currency;\r\n          }\r\n        });\r\n\r\n        return {\r\n          count: allLinks.length,\r\n          totalAmount,\r\n          currency: primaryCurrency,\r\n          links: allLinks,\r\n        };\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get payment link details by token (public endpoint, no auth required)\r\n   * Used on the public payment page\r\n   *\r\n   * @param token - Payment link token\r\n   * @returns Observable of payment link details\r\n   */\r\n  getPaymentLinkByToken(token: string): Observable<any> {\r\n    return this.subtrak.get(`payment-links/${token}`);\r\n  }\r\n\r\n  /**\r\n   * Get one-time payment link details by token (public endpoint, no auth required)\r\n   *\r\n   * @param token - Payment link token\r\n   * @returns Observable of payment link details\r\n   */\r\n  getOneTimePaymentLinkByToken(token: string): Observable<any> {\r\n    return this.subtrak.get(`one-time-payment-links/${token}`);\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { SubtrakService } from './subtrak.service';\nimport { Customer } from '../models';\n\n/**\n * Service for managing customers\n */\n@Injectable()\nexport class CustomersService {\n    constructor(private subtrak: SubtrakService) { }\n\n    /**\n     * Get a specific customer by ID\n     *\n     * @param customerId - Customer ID\n     * @returns Observable of the customer\n     */\n    getCustomer(customerId: string): Observable<Customer> {\n        return this.subtrak.get<Customer>(`customers/${customerId}`);\n    }\n}\n","/**\n * Subtrak Angular SDK Services\n */\n\nexport { SubtrakService } from './subtrak.service';\nexport { SubscriptionsService } from './subscriptions.service';\nexport { EntitlementsService } from './entitlements.service';\nexport { UsageService } from './usage.service';\nexport { PaymentMethodsService } from './payment-methods.service';\nexport { InvoicesService } from './invoices.service';\nexport { PaymentLinksService } from './payment-links.service';\nexport { CustomersService } from './customers.service';\n","/**\n * Base error class for all Subtrak SDK errors\n */\nexport class SubtrakError extends Error {\n  constructor(\n    message: string,\n    public readonly code?: string,\n    public readonly statusCode?: number,\n    public readonly requestId?: string,\n    public readonly details?: Record<string, any>\n  ) {\n    super(message);\n    this.name = 'SubtrakError';\n    Object.setPrototypeOf(this, SubtrakError.prototype);\n  }\n}\n\n/**\n * Error for API errors (4xx/5xx responses)\n */\nexport class ApiError extends SubtrakError {\n  constructor(\n    message: string,\n    statusCode: number,\n    code?: string,\n    requestId?: string,\n    details?: Record<string, any>\n  ) {\n    super(message, code, statusCode, requestId, details);\n    this.name = 'ApiError';\n    Object.setPrototypeOf(this, ApiError.prototype);\n  }\n}\n\n/**\n * Error for validation failures (400)\n */\nexport class ValidationError extends ApiError {\n  constructor(\n    message: string,\n    details?: Record<string, any>,\n    requestId?: string\n  ) {\n    super(message, 400, 'VALIDATION_ERROR', requestId, details);\n    this.name = 'ValidationError';\n    Object.setPrototypeOf(this, ValidationError.prototype);\n  }\n}\n\n/**\n * Error for authentication failures (401)\n */\nexport class AuthError extends ApiError {\n  constructor(message: string = 'Unauthorized', requestId?: string) {\n    super(message, 401, 'AUTH_ERROR', requestId);\n    this.name = 'AuthError';\n    Object.setPrototypeOf(this, AuthError.prototype);\n  }\n}\n\n/**\n * Error for permission/authorization failures (403)\n */\nexport class PermissionError extends ApiError {\n  constructor(message: string = 'Forbidden', requestId?: string) {\n    super(message, 403, 'PERMISSION_ERROR', requestId);\n    this.name = 'PermissionError';\n    Object.setPrototypeOf(this, PermissionError.prototype);\n  }\n}\n\n/**\n * Error for resource not found (404)\n */\nexport class NotFoundError extends ApiError {\n  constructor(\n    resource: string,\n    id?: string,\n    requestId?: string\n  ) {\n    const message = id\n      ? `${resource} not found: ${id}`\n      : `${resource} not found`;\n    super(message, 404, 'NOT_FOUND', requestId);\n    this.name = 'NotFoundError';\n    Object.setPrototypeOf(this, NotFoundError.prototype);\n  }\n}\n\n/**\n * Error for rate limiting (429)\n */\nexport class RateLimitError extends ApiError {\n  constructor(\n    public readonly retryAfter?: number,\n    requestId?: string\n  ) {\n    super('Rate limit exceeded', 429, 'RATE_LIMIT_ERROR', requestId, {\n      retryAfter,\n    });\n    this.name = 'RateLimitError';\n    Object.setPrototypeOf(this, RateLimitError.prototype);\n  }\n}\n\n/**\n * Error for network/connection issues\n */\nexport class NetworkError extends SubtrakError {\n  constructor(message: string = 'Network error', details?: Record<string, any>) {\n    super(message, 'NETWORK_ERROR', undefined, undefined, details);\n    this.name = 'NetworkError';\n    Object.setPrototypeOf(this, NetworkError.prototype);\n  }\n}\n\n/**\n * Error for request timeout\n */\nexport class TimeoutError extends SubtrakError {\n  constructor(timeout: number) {\n    super(`Request timeout after ${timeout}ms`, 'TIMEOUT_ERROR');\n    this.name = 'TimeoutError';\n    Object.setPrototypeOf(this, TimeoutError.prototype);\n  }\n}\n\n/**\n * Error for configuration issues\n */\nexport class ConfigError extends SubtrakError {\n  constructor(message: string) {\n    super(message, 'CONFIG_ERROR');\n    this.name = 'ConfigError';\n    Object.setPrototypeOf(this, ConfigError.prototype);\n  }\n}\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { SubtrakConfig } from '../tokens/config.token';\nimport { ConfigError } from '../errors/subtrak-error';\n\n/**\n * HTTP Interceptor that adds authentication headers to requests\n */\nexport const createAuthInterceptor = (config: SubtrakConfig): HttpInterceptorFn => {\n  return (req, next) => {\n    // Only intercept Subtrak API requests\n    if (!req.url.includes('/api/v5/')) {\n      return next(req);\n    }\n\n    // Get API key (prefer secretKey, fallback to publicKey)\n    const apiKey = config.secretKey || config.publicKey;\n\n    if (!apiKey) {\n      throw new ConfigError('No API key provided. Please configure either publicKey or secretKey.');\n    }\n\n    // Validate API key format\n    if (!apiKey.startsWith('pk_') && !apiKey.startsWith('sk_')) {\n      throw new ConfigError('Invalid API key format. Must start with pk_ or sk_.');\n    }\n\n    // Add Authorization header\n    const authReq = req.clone({\n      setHeaders: {\n        'Authorization': `Bearer ${apiKey}`,\n        'Content-Type': 'application/json',\n      },\n    });\n\n    return next(authReq);\n  };\n};\n","/**\n * Utility functions for transforming between camelCase and snake_case\n */\n\n/**\n * Convert a string from camelCase to snake_case\n */\nexport function toSnakeCase(str: string): string {\n  return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Convert a string from snake_case to camelCase\n */\nexport function toCamelCase(str: string): string {\n  return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Recursively transform object keys from camelCase to snake_case\n */\nexport function transformKeysToSnakeCase<T = any>(obj: any): T {\n  if (obj === null || obj === undefined) {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map(item => transformKeysToSnakeCase(item)) as any;\n  }\n\n  if (typeof obj === 'object' && obj.constructor === Object) {\n    return Object.keys(obj).reduce((result, key) => {\n      const snakeKey = toSnakeCase(key);\n      result[snakeKey] = transformKeysToSnakeCase(obj[key]);\n      return result;\n    }, {} as any);\n  }\n\n  return obj;\n}\n\n/**\n * Recursively transform object keys from snake_case to camelCase\n */\nexport function transformKeysToCamelCase<T = any>(obj: any): T {\n  if (obj === null || obj === undefined) {\n    return obj;\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map(item => transformKeysToCamelCase(item)) as any;\n  }\n\n  if (typeof obj === 'object' && obj.constructor === Object) {\n    return Object.keys(obj).reduce((result, key) => {\n      const camelKey = toCamelCase(key);\n      result[camelKey] = transformKeysToCamelCase(obj[key]);\n      return result;\n    }, {} as any);\n  }\n\n  return obj;\n}\n\n/**\n * Transform pagination params from camelCase to snake_case\n */\nexport function transformPaginationParams(params: any): any {\n  if (!params) return {};\n\n  const transformed: any = {};\n\n  if (params.page !== undefined) transformed.page = params.page;\n  if (params.limit !== undefined) transformed.limit = params.limit;\n\n  // Transform other params\n  Object.keys(params).forEach(key => {\n    if (key !== 'page' && key !== 'limit') {\n      const snakeKey = toSnakeCase(key);\n      transformed[snakeKey] = params[key];\n    }\n  });\n\n  return transformed;\n}\n","import { HttpInterceptorFn, HttpResponse } from '@angular/common/http';\nimport { map } from 'rxjs';\nimport { transformKeysToSnakeCase, transformKeysToCamelCase } from '../utils/case-transform';\n\n/**\n * HTTP Interceptor that transforms request/response data between camelCase and snake_case\n * - Outgoing requests: camelCase → snake_case\n * - Incoming responses: snake_case → camelCase\n */\nexport const caseTransformInterceptor: HttpInterceptorFn = (req, next) => {\n  // Only intercept Subtrak API requests\n  if (!req.url.includes('/api/v5/')) {\n    return next(req);\n  }\n\n  // Transform request body from camelCase to snake_case\n  let transformedReq = req;\n  if (req.body && (req.method === 'POST' || req.method === 'PUT' || req.method === 'PATCH')) {\n    const transformedBody = transformKeysToSnakeCase(req.body);\n    transformedReq = req.clone({ body: transformedBody });\n  }\n\n  // Transform query params from camelCase to snake_case\n  if (req.params.keys().length > 0) {\n    let newParams = req.params;\n    req.params.keys().forEach(key => {\n      const snakeKey = toSnakeCase(key);\n      if (snakeKey !== key) {\n        const values = req.params.getAll(key);\n        values?.forEach(value => {\n          newParams = newParams.append(snakeKey, value);\n        });\n        newParams = newParams.delete(key);\n      }\n    });\n    transformedReq = transformedReq.clone({ params: newParams });\n  }\n\n  // Process response and transform from snake_case to camelCase\n  return next(transformedReq).pipe(\n    map(event => {\n      if (event instanceof HttpResponse && event.body) {\n        const transformedBody = transformKeysToCamelCase(event.body);\n        return event.clone({ body: transformedBody });\n      }\n      return event;\n    })\n  );\n};\n\n/**\n * Convert camelCase to snake_case\n */\nfunction toSnakeCase(str: string): string {\n  return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { catchError, throwError } from 'rxjs';\nimport {\n  ApiError,\n  ValidationError,\n  AuthError,\n  PermissionError,\n  NotFoundError,\n  RateLimitError,\n  NetworkError,\n  TimeoutError,\n} from '../errors/subtrak-error';\n\n/**\n * HTTP Interceptor that transforms HTTP errors into typed SubtrakError instances\n */\nexport const errorInterceptor: HttpInterceptorFn = (req, next) => {\n  return next(req).pipe(\n    catchError((error: HttpErrorResponse) => {\n      // Only handle Subtrak API errors\n      if (!req.url.includes('/api/v5/')) {\n        return throwError(() => error);\n      }\n\n      // Extract error details\n      const errorBody = error.error || {};\n      const message = errorBody.message || errorBody.error || error.message || 'An error occurred';\n      const requestId = error.headers.get('x-request-id') || undefined;\n      const details = errorBody.details;\n\n      // Handle network errors (no response from server)\n      if (error.status === 0) {\n        if (error.error instanceof ProgressEvent) {\n          // Network connection error\n          return throwError(() => new NetworkError('Network connection failed', {\n            originalError: error.message,\n          }));\n        }\n        // Timeout\n        return throwError(() => new TimeoutError(30000));\n      }\n\n      // Map HTTP status codes to specific error classes\n      switch (error.status) {\n        case 400:\n          return throwError(() => new ValidationError(message, details, requestId));\n\n        case 401:\n          return throwError(() => new AuthError(message, requestId));\n\n        case 403:\n          return throwError(() => new PermissionError(message, requestId));\n\n        case 404:\n          // Try to extract resource type from URL\n          const resource = extractResourceFromUrl(req.url);\n          return throwError(() => new NotFoundError(resource, undefined, requestId));\n\n        case 429:\n          const retryAfter = error.headers.get('retry-after');\n          const retryAfterSeconds = retryAfter ? parseInt(retryAfter, 10) : undefined;\n          return throwError(() => new RateLimitError(retryAfterSeconds, requestId));\n\n        case 500:\n        case 502:\n        case 503:\n        case 504:\n          return throwError(() => new ApiError(\n            'Server error. Please try again later.',\n            error.status,\n            'SERVER_ERROR',\n            requestId\n          ));\n\n        default:\n          return throwError(() => new ApiError(\n            message,\n            error.status,\n            errorBody.code,\n            requestId,\n            details\n          ));\n      }\n    })\n  );\n};\n\n/**\n * Extract resource type from URL\n * e.g., /api/v5/products/123 → 'Product'\n */\nfunction extractResourceFromUrl(url: string): string {\n  const match = url.match(/\\/api\\/v5\\/([^\\/\\?]+)/);\n  if (match && match[1]) {\n    const resource = match[1];\n    // Capitalize first letter and remove trailing 's' if present\n    return resource.charAt(0).toUpperCase() + resource.slice(1, -1);\n  }\n  return 'Resource';\n}\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { retry, timer } from 'rxjs';\nimport { SubtrakConfig } from '../tokens/config.token';\n\n/**\n * HTTP Interceptor that implements exponential backoff retry logic\n */\nexport const createRetryInterceptor = (config: SubtrakConfig): HttpInterceptorFn => {\n  return (req, next) => {\n    // Only retry Subtrak API requests\n    if (!req.url.includes('/api/v5/')) {\n      return next(req);\n    }\n\n    // Don't retry mutations (POST, PUT, PATCH, DELETE) by default\n    // Only retry safe methods (GET, HEAD, OPTIONS)\n    if (!['GET', 'HEAD', 'OPTIONS'].includes(req.method)) {\n      return next(req);\n    }\n\n    const maxRetries = config.maxRetries || 3;\n\n    return next(req).pipe(\n      retry({\n        count: maxRetries,\n        delay: (error: HttpErrorResponse, retryCount: number) => {\n          // Only retry on retryable status codes\n          const retryableStatusCodes = [429, 500, 502, 503, 504];\n          const shouldRetry =\n            error.status === 0 || // Network error\n            retryableStatusCodes.includes(error.status);\n\n          if (!shouldRetry) {\n            throw error; // Don't retry, propagate error\n          }\n\n          // Calculate exponential backoff delay\n          const baseDelay = 500; // 500ms\n          const maxDelay = 10000; // 10s\n          const backoffMultiplier = 2;\n\n          const delay = Math.min(\n            baseDelay * Math.pow(backoffMultiplier, retryCount - 1),\n            maxDelay\n          );\n\n          // For rate limit errors, respect the Retry-After header\n          if (error.status === 429) {\n            const retryAfter = error.headers.get('retry-after');\n            if (retryAfter) {\n              const retryAfterMs = parseInt(retryAfter, 10) * 1000;\n              return timer(retryAfterMs);\n            }\n          }\n\n          // Log retry attempt in debug mode\n          if (config.debug) {\n            console.log(`[Subtrak SDK] Retry attempt ${retryCount}/${maxRetries} after ${delay}ms`);\n          }\n\n          return timer(delay);\n        },\n      })\n    );\n  };\n};\n","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject, takeUntil } from 'rxjs';\nimport { SubscriptionsService } from '../../services';\nimport { SubtrakService } from '../../services/subtrak.service';\nimport {\n  PriceWithEntitlements,\n  EntitlementValue,\n  Customer,\n  PaymentMode,\n  CreateSubscriptionResult,\n  PaymentUrlReadyEvent\n} from '../../models';\n\n/**\n * Displays available subscription plans with feature comparison\n *\n * @example\n * ```html\n * <!-- Basic usage: Emit planSelected event -->\n * <subtrak-pricing-table\n *   [customerId]=\"currentUser.id\"\n *   [currentPlanId]=\"currentPriceId\"\n *   (planSelected)=\"onPlanSelected($event)\">\n * </subtrak-pricing-table>\n *\n * <!-- Auto-create subscription (Paymob/Stripe flow) -->\n * <subtrak-pricing-table\n *   [customerId]=\"currentUser.id\"\n *   [autoCreateSubscription]=\"true\"\n *   [paymentMode]=\"'new-window'\"\n *   (subscriptionCreated)=\"onSubscriptionCreated($event)\"\n *   (paymentUrlReady)=\"onPaymentUrlReady($event)\"\n *   (subscriptionError)=\"onError($event)\">\n * </subtrak-pricing-table>\n *\n * <!-- Iframe mode for embedded payment -->\n * <subtrak-pricing-table\n *   [customerId]=\"currentUser.id\"\n *   [autoCreateSubscription]=\"true\"\n *   [paymentMode]=\"'iframe'\"\n *   (paymentUrlReady)=\"showPaymentIframe($event)\">\n * </subtrak-pricing-table>\n * ```\n */\n@Component({\n  selector: 'subtrak-pricing-table',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './pricing-table.component.html',\n  styleUrl: './pricing-table.component.scss'\n})\nexport class PricingTableComponent implements OnInit, OnDestroy {\n  /**\n   * Optional: Customer ID to auto-fetch country code\n   */\n  @Input() customerId?: string;\n\n  /**\n   * Optional: ISO country code to filter plans (e.g., 'US', 'EG')\n   * If not provided and customerId is provided, will be fetched automatically\n   */\n  @Input() countryCode?: string;\n\n  /**\n   * Current plan ID to highlight\n   */\n  @Input() currentPlanId?: string;\n\n  /**\n   * Entitlement codes to highlight in feature lists\n   */\n  @Input() highlightEntitlements?: string[];\n\n  /**\n   * If true, automatically creates subscription when plan is selected\n   * Follows Paymob/Stripe flow: create subscription → handle payment if required\n   */\n  @Input() autoCreateSubscription: boolean = false;\n\n  /**\n   * Payment mode when autoCreateSubscription is enabled\n   * - 'new-window': Opens payment URL in new tab (default)\n   * - 'redirect': Redirects current window to payment URL\n   * - 'iframe': Emits paymentUrlReady event for parent to render iframe\n   */\n  @Input() paymentMode: PaymentMode = 'new-window';\n\n  /**\n   * Emitted when a plan is selected (legacy, for backward compatibility)\n   * Still emitted even when autoCreateSubscription is true\n   */\n  @Output() planSelected = new EventEmitter<PriceWithEntitlements>();\n\n  /**\n   * Emitted when subscription is successfully created\n   * Only emitted when autoCreateSubscription is true\n   */\n  @Output() subscriptionCreated = new EventEmitter<CreateSubscriptionResult>();\n\n  /**\n   * Emitted when payment URL is ready (iframe mode)\n   * Only emitted when autoCreateSubscription is true and paymentMode is 'iframe'\n   */\n  @Output() paymentUrlReady = new EventEmitter<PaymentUrlReadyEvent>();\n\n  /**\n   * Emitted when subscription creation fails\n   * Only emitted when autoCreateSubscription is true\n   */\n  @Output() subscriptionError = new EventEmitter<Error>();\n\n  planOptions: { name: string; description: string | null; prices: PriceWithEntitlements[] }[] = [];\n  plans: PriceWithEntitlements[] = []; // Current visible plans based on interval\n  billingInterval: 'MONTHLY' | 'YEARLY' = 'MONTHLY';\n  loading = true;\n  error: string | null = null;\n  creatingSubscription = false;\n\n  private destroy$ = new Subject<void>();\n\n  constructor(\n    private subscriptionsService: SubscriptionsService,\n    private subtrak: SubtrakService\n  ) { }\n\n  async ngOnInit(): Promise<void> {\n    // Fetch country code from customer if not provided\n    if (!this.countryCode && this.customerId) {\n      await this.fetchCustomerCountry();\n    }\n    this.loadPlans();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private async fetchCustomerCountry(): Promise<void> {\n    return new Promise((resolve) => {\n      this.subtrak.get<Customer>(`/customers/${this.customerId}`)\n        .pipe(takeUntil(this.destroy$))\n        .subscribe({\n          next: (customer) => {\n            this.countryCode = customer.countryCode;\n            resolve();\n          },\n          error: (err) => {\n            console.warn('Failed to fetch customer country, showing all plans:', err);\n            // Continue without country filter if fetch fails\n            resolve();\n          }\n        });\n    });\n  }\n\n  public loadPlans(): void {\n    this.loading = true;\n    this.error = null;\n\n    this.subscriptionsService\n      .getPlansForCustomer(this.customerId, undefined, this.countryCode)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (options) => {\n          this.planOptions = options;\n          this.updateVisiblePlans();\n          this.loading = false;\n        },\n        error: (err) => {\n          this.error = err.message || 'Failed to load pricing plans';\n          this.loading = false;\n        }\n      });\n  }\n\n  public setBillingInterval(interval: 'MONTHLY' | 'YEARLY'): void {\n    this.billingInterval = interval;\n    this.updateVisiblePlans();\n  }\n\n  private updateVisiblePlans(): void {\n    // Flatten options to find prices matching the interval\n    this.plans = this.planOptions\n      .map(option => option.prices.find(p => p.billingInterval === this.billingInterval))\n      .filter((p): p is PriceWithEntitlements => !!p);\n  }\n\n  /**\n   * Check if a plan is the current plan\n   */\n  isCurrentPlan(priceId: string): boolean {\n    return this.currentPlanId === priceId;\n  }\n\n  /**\n   * Check if an entitlement should be highlighted\n   */\n  isHighlighted(entitlement: EntitlementValue): boolean {\n    if (!this.highlightEntitlements || this.highlightEntitlements.length === 0) {\n      return false;\n    }\n    return this.highlightEntitlements.includes(entitlement.code);\n  }\n\n  /**\n   * Handle plan selection\n   */\n  selectPlan(plan: PriceWithEntitlements): void {\n    if (this.isCurrentPlan(plan.id)) {\n      return;\n    }\n\n    // Always emit planSelected for backward compatibility\n    this.planSelected.emit(plan);\n\n    // If autoCreateSubscription is enabled, create subscription automatically\n    if (this.autoCreateSubscription) {\n      this.createSubscriptionForPlan(plan);\n    }\n  }\n\n  /**\n   * Create subscription for selected plan (auto-create flow)\n   */\n  private createSubscriptionForPlan(plan: PriceWithEntitlements): void {\n    if (!this.customerId) {\n      const error = new Error('customerId is required for auto-creating subscriptions');\n      this.subscriptionError.emit(error);\n      console.error('[PricingTableComponent]', error.message);\n      return;\n    }\n\n    this.creatingSubscription = true;\n\n    this.subscriptionsService\n      .createSubscription({\n        customerId: this.customerId,\n        priceId: plan.id,\n        quantity: 1\n      })\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (result: CreateSubscriptionResult) => {\n          this.creatingSubscription = false;\n\n          // Emit subscriptionCreated event\n          this.subscriptionCreated.emit(result);\n\n          // Handle payment requirement\n          if (result.requiresPayment && result.paymentUrl) {\n            this.handlePaymentRequired(result, plan);\n          } else {\n            // Subscription activated immediately (free plan or trial)\n            console.log('[PricingTableComponent] Subscription created successfully:', result);\n          }\n        },\n        error: (err) => {\n          this.creatingSubscription = false;\n          const error = err instanceof Error ? err : new Error(err.message || 'Failed to create subscription');\n          this.subscriptionError.emit(error);\n          console.error('[PricingTableComponent] Error creating subscription:', err);\n        }\n      });\n  }\n\n  /**\n   * Handle payment requirement based on payment mode\n   */\n  private handlePaymentRequired(result: CreateSubscriptionResult, plan: PriceWithEntitlements): void {\n    const paymentUrl = result.paymentUrl!;\n\n    switch (this.paymentMode) {\n      case 'new-window':\n        // Open payment URL in new tab\n        window.open(paymentUrl, '_blank');\n        console.log('[PricingTableComponent] Opened payment URL in new window:', paymentUrl);\n        break;\n\n      case 'redirect':\n        // Redirect current window to payment URL\n        window.location.href = paymentUrl;\n        break;\n\n      case 'iframe':\n        // Emit event for parent to render iframe\n        this.paymentUrlReady.emit({\n          paymentUrl,\n          iframeId: result.subscription?.id,\n          subscriptionId: result.subscription?.id,\n          amount: parseFloat(plan.unitAmount || '0'),\n          currency: plan.currency\n        });\n        console.log('[PricingTableComponent] Emitted paymentUrlReady event for iframe mode');\n        break;\n    }\n  }\n\n  /**\n   * Get formatted price display\n   */\n  getPriceDisplay(plan: PriceWithEntitlements): string {\n    if (!plan.unitAmount) {\n      return 'Free';\n    }\n\n    const amount = parseFloat(plan.unitAmount);\n    const formatted = new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency: plan.currency.toUpperCase(),\n      minimumFractionDigits: 0,\n      maximumFractionDigits: 2\n    }).format(amount);\n\n    return formatted;\n  }\n\n  /**\n   * Get billing interval display text\n   */\n  getBillingIntervalDisplay(plan: PriceWithEntitlements): string {\n    if (!plan.billingInterval) {\n      return '';\n    }\n\n    const intervalMap: Record<string, string> = {\n      DAILY: 'day',\n      WEEKLY: 'week',\n      MONTHLY: 'month',\n      QUARTERLY: 'quarter',\n      ANNUAL: 'year'\n    };\n\n    const interval = intervalMap[plan.billingInterval] || plan.billingInterval.toLowerCase();\n    const count = plan.billingIntervalCount || 1;\n\n    if (count === 1) {\n      return `per ${interval}`;\n    }\n\n    return `per ${count} ${interval}s`;\n  }\n\n  /**\n   * Format entitlement value for display\n   */\n  formatEntitlementValue(entitlement: EntitlementValue): string {\n    if (entitlement.type === 'BOOLEAN') {\n      return entitlement.value ? '✓' : '✗';\n    }\n\n    if (entitlement.type === 'NUMERIC') {\n      const value = entitlement.value as number;\n      if (value === -1) {\n        return 'Unlimited';\n      }\n      const unit = entitlement.unit ? ` ${entitlement.unit}` : '';\n      return `${value.toLocaleString()}${unit}`;\n    }\n\n    if (entitlement.type === 'ENUM') {\n      return String(entitlement.value || '');\n    }\n\n    return String(entitlement.value || '—');\n  }\n\n  /**\n   * Get button text for a plan\n   */\n  getButtonText(plan: PriceWithEntitlements): string {\n    if (this.isCurrentPlan(plan.id)) {\n      return 'Current Plan';\n    }\n    if (this.creatingSubscription) {\n      return 'Creating...';\n    }\n    return this.autoCreateSubscription ? 'Subscribe Now' : 'Select Plan';\n  }\n\n  /**\n   * Track by function for ngFor optimization\n   */\n  trackByPlanId(index: number, plan: PriceWithEntitlements): string {\n    return plan.id;\n  }\n\n  /**\n   * Track by function for entitlements\n   */\n  trackByEntitlementCode(index: number, entitlement: EntitlementValue): string {\n    return entitlement.code;\n  }\n}\n","<div class=\"subtrak-pricing-table\">\n  <!-- Loading State -->\n  <div *ngIf=\"loading\" class=\"loading-state\">\n    <div class=\"spinner\"></div>\n    <p>Loading pricing plans...</p>\n  </div>\n\n  <!-- Error State -->\n  <div *ngIf=\"error && !loading\" class=\"error-state\">\n    <div class=\"error-icon\">⚠️</div>\n    <p class=\"error-message\">{{ error }}</p>\n    <button class=\"retry-button\" (click)=\"loadPlans()\">Retry</button>\n  </div>\n\n  <!-- Interval Switcher -->\n  <div *ngIf=\"!loading && !error && plans.length > 0\" class=\"interval-switcher\"\n    style=\"display: flex; justify-content: center; gap: 1rem; margin-bottom: 2rem;\">\n    <button [class.active]=\"billingInterval === 'MONTHLY'\" (click)=\"setBillingInterval('MONTHLY')\"\n      style=\"padding: 0.5rem 1rem; border-radius: 20px; border: 1px solid #e2e8f0; cursor: pointer; background: white;\"\n      [style.background]=\"billingInterval === 'MONTHLY' ? '#0f172a' : 'white'\"\n      [style.color]=\"billingInterval === 'MONTHLY' ? 'white' : '#64748b'\">\n      Monthly\n    </button>\n    <button [class.active]=\"billingInterval === 'YEARLY'\" (click)=\"setBillingInterval('YEARLY')\"\n      style=\"padding: 0.5rem 1rem; border-radius: 20px; border: 1px solid #e2e8f0; cursor: pointer; background: white;\"\n      [style.background]=\"billingInterval === 'YEARLY' ? '#0f172a' : 'white'\"\n      [style.color]=\"billingInterval === 'YEARLY' ? 'white' : '#64748b'\">\n      Yearly\n    </button>\n  </div>\n\n  <!-- Plans Grid -->\n  <div *ngIf=\"!loading && !error\" class=\"plans-grid\">\n    <div *ngFor=\"let plan of plans; trackBy: trackByPlanId\" class=\"plan-card\"\n      [class.current-plan]=\"isCurrentPlan(plan.id)\">\n      <!-- Plan Header -->\n      <div class=\"plan-header\">\n        <h3 class=\"plan-name\">{{ plan.nickname }}</h3>\n        <p *ngIf=\"plan.description\" class=\"plan-description\">{{ plan.description }}</p>\n      </div>\n\n      <!-- Pricing -->\n      <div class=\"plan-pricing\">\n        <div class=\"price\">{{ getPriceDisplay(plan) }}</div>\n        <div *ngIf=\"plan.billingInterval\" class=\"interval\">\n          {{ getBillingIntervalDisplay(plan) }}\n        </div>\n      </div>\n\n      <!-- Trial Period -->\n      <div *ngIf=\"plan.trialPeriodDays\" class=\"trial-badge\">\n        {{ plan.trialPeriodDays }}-day free trial\n      </div>\n\n      <!-- Current Plan Badge -->\n      <div *ngIf=\"isCurrentPlan(plan.id)\" class=\"current-badge\">\n        Current Plan\n      </div>\n\n      <!-- Features List -->\n      <div class=\"features-list\">\n        <div *ngFor=\"let entitlement of plan.entitlements; trackBy: trackByEntitlementCode\" class=\"feature-item\"\n          [class.highlighted]=\"isHighlighted(entitlement)\">\n          <span class=\"feature-value\">{{ formatEntitlementValue(entitlement) }}</span>\n          <span class=\"feature-name\">{{ entitlement.name }}</span>\n          <span *ngIf=\"entitlement.description\" class=\"feature-description\">\n            {{ entitlement.description }}\n          </span>\n        </div>\n\n        <!-- Show message if no entitlements -->\n        <div *ngIf=\"plan.entitlements.length === 0\" class=\"no-features\">\n          No features listed\n        </div>\n      </div>\n\n      <!-- Action Button -->\n      <button class=\"select-button\" [class.current]=\"isCurrentPlan(plan.id)\" [disabled]=\"isCurrentPlan(plan.id)\"\n        (click)=\"selectPlan(plan)\">\n        {{ getButtonText(plan) }}\n      </button>\n    </div>\n  </div>\n\n  <!-- Empty State -->\n  <div *ngIf=\"!loading && !error && plans.length === 0\" class=\"empty-state\">\n    <p>No pricing plans available</p>\n  </div>\n</div>","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject, takeUntil, forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { SubscriptionsService } from '../../services';\nimport { SubscriptionWithRelations, EntitlementValue, UsageSummary } from '../../models';\n\n/**\n * Displays current subscription information with optional entitlements and usage\n *\n * @example\n * ```html\n * <subtrak-subscription-status\n *   [customerId]=\"customerId\"\n *   [showEntitlements]=\"true\"\n *   [showUsageMeters]=\"true\"\n *   [showUpgradeButton]=\"true\"\n *   (upgradeClicked)=\"onUpgrade()\">\n * </subtrak-subscription-status>\n * ```\n */\n@Component({\n  selector: 'subtrak-subscription-status',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './subscription-status.component.html',\n  styleUrl: './subscription-status.component.scss'\n})\nexport class SubscriptionStatusComponent implements OnInit, OnDestroy, OnChanges {\n  /**\n   * Customer ID to fetch subscription for\n   */\n  @Input({ required: true }) customerId!: string;\n\n  /**\n   * Whether to show entitlements list\n   */\n  @Input() showEntitlements = false;\n\n  /**\n   * Whether to show usage meters\n   */\n  @Input() showUsageMeters = false;\n\n  /**\n   * Whether to show upgrade button\n   */\n  @Input() showUpgradeButton = true;\n\n  /**\n   * Emitted when upgrade button is clicked\n   */\n  @Output() upgradeClicked = new EventEmitter<void>();\n\n  subscription: SubscriptionWithRelations | null = null;\n  entitlements: EntitlementValue[] = [];\n  usageData: any = null;\n  loading = true;\n  error: string | null = null;\n\n  private destroy$ = new Subject<void>();\n\n  constructor(private subscriptionsService: SubscriptionsService) {}\n\n  ngOnInit(): void {\n    this.loadSubscriptionData();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['customerId'] && !changes['customerId'].firstChange) {\n      this.loadSubscriptionData();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private loadSubscriptionData(): void {\n    if (!this.customerId) {\n      return;\n    }\n\n    this.loading = true;\n    this.error = null;\n\n    this.subscriptionsService\n      .getCurrentSubscription(this.customerId)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (subscription) => {\n          this.subscription = subscription;\n          this.loadAdditionalData(subscription.id);\n        },\n        error: (err) => {\n          this.error = err.message || 'Failed to load subscription';\n          this.loading = false;\n        }\n      });\n  }\n\n  private loadAdditionalData(subscriptionId: string): void {\n    const requests: any = {};\n\n    if (this.showEntitlements) {\n      requests.entitlements = this.subscriptionsService\n        .getEntitlements(subscriptionId)\n        .pipe(catchError(() => of([])));\n    }\n\n    if (this.showUsageMeters) {\n      requests.usage = this.subscriptionsService\n        .getUsage(subscriptionId)\n        .pipe(catchError(() => of(null)));\n    }\n\n    if (Object.keys(requests).length === 0) {\n      this.loading = false;\n      return;\n    }\n\n    forkJoin(requests)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (results: any) => {\n          if (results.entitlements) {\n            this.entitlements = results.entitlements;\n          }\n          if (results.usage) {\n            this.usageData = results.usage;\n          }\n          this.loading = false;\n        },\n        error: () => {\n          this.loading = false;\n        }\n      });\n  }\n\n  /**\n   * Get status badge class\n   */\n  getStatusClass(): string {\n    if (!this.subscription) return 'status-unknown';\n    return `status-${this.subscription.status.toLowerCase()}`;\n  }\n\n  /**\n   * Get formatted status text\n   */\n  getStatusText(): string {\n    if (!this.subscription) return 'Unknown';\n\n    const statusMap: Record<string, string> = {\n      FREE: 'Free Plan',\n      TRIAL: 'Trial',\n      PENDING: 'Pending',\n      ACTIVE: 'Active',\n      PAST_DUE: 'Past Due',\n      SUSPENDED: 'Suspended',\n      CANCELLED: 'Cancelled',\n      EXPIRED: 'Expired'\n    };\n\n    return statusMap[this.subscription.status] || this.subscription.status;\n  }\n\n  /**\n   * Format date for display\n   */\n  formatDate(dateString: string | null): string {\n    if (!dateString) return '—';\n    const date = new Date(dateString);\n    return date.toLocaleDateString('en-US', {\n      year: 'numeric',\n      month: 'short',\n      day: 'numeric'\n    });\n  }\n\n  /**\n   * Get days remaining in trial\n   */\n  getTrialDaysRemaining(): number | null {\n    if (!this.subscription || !this.subscription.trialEnd) {\n      return null;\n    }\n\n    const now = new Date();\n    const trialEnd = new Date(this.subscription.trialEnd);\n    const diffTime = trialEnd.getTime() - now.getTime();\n    const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n    return diffDays > 0 ? diffDays : 0;\n  }\n\n  /**\n   * Check if subscription is in trial\n   */\n  isInTrial(): boolean {\n    return this.subscription?.status === 'TRIAL';\n  }\n\n  /**\n   * Check if subscription is active or in trial\n   */\n  isActiveOrTrial(): boolean {\n    if (!this.subscription) return false;\n    return ['ACTIVE', 'TRIAL'].includes(this.subscription.status);\n  }\n\n  /**\n   * Handle upgrade button click\n   */\n  onUpgrade(): void {\n    this.upgradeClicked.emit();\n  }\n\n  /**\n   * Format entitlement value for display\n   */\n  formatEntitlementValue(entitlement: EntitlementValue): string {\n    if (entitlement.type === 'BOOLEAN') {\n      return entitlement.value ? '✓ Enabled' : '✗ Disabled';\n    }\n\n    if (entitlement.type === 'NUMERIC') {\n      const value = entitlement.value as number;\n      if (value === -1) {\n        return 'Unlimited';\n      }\n      const unit = entitlement.unit ? ` ${entitlement.unit}` : '';\n      return `${value.toLocaleString()}${unit}`;\n    }\n\n    if (entitlement.type === 'ENUM') {\n      return String(entitlement.value || '');\n    }\n\n    return String(entitlement.value || '—');\n  }\n\n  /**\n   * Track by function for entitlements\n   */\n  trackByCode(index: number, entitlement: EntitlementValue): string {\n    return entitlement.code;\n  }\n}\n","<div class=\"subtrak-subscription-status\">\n  <!-- Loading State -->\n  <div *ngIf=\"loading\" class=\"loading-state\">\n    <div class=\"spinner\"></div>\n    <p>Loading subscription...</p>\n  </div>\n\n  <!-- Error State -->\n  <div *ngIf=\"error && !loading\" class=\"error-state\">\n    <div class=\"error-icon\">⚠️</div>\n    <p class=\"error-message\">{{ error }}</p>\n  </div>\n\n  <!-- Subscription Data -->\n  <div *ngIf=\"!loading && !error && subscription\" class=\"subscription-content\">\n    <!-- Main Status Card -->\n    <div class=\"status-card\">\n      <div class=\"status-header\">\n        <h3 class=\"plan-name\">{{ subscription.price.product.name }}</h3>\n        <span class=\"status-badge\" [ngClass]=\"getStatusClass()\">\n          {{ getStatusText() }}\n        </span>\n      </div>\n\n      <p class=\"plan-nickname\">{{ subscription.price.nickname }}</p>\n\n      <!-- Trial Information -->\n      <div *ngIf=\"isInTrial()\" class=\"trial-info\">\n        <span class=\"trial-icon\">🎁</span>\n        <span class=\"trial-text\">\n          {{ getTrialDaysRemaining() }} days remaining in trial\n        </span>\n      </div>\n\n      <!-- Billing Information -->\n      <div class=\"billing-info\">\n        <div class=\"info-row\">\n          <span class=\"label\">Current Period:</span>\n          <span class=\"value\">\n            {{ formatDate(subscription.currentPeriodStart) }} - {{ formatDate(subscription.currentPeriodEnd) }}\n          </span>\n        </div>\n\n        <div *ngIf=\"subscription.currentPeriodEnd\" class=\"info-row\">\n          <span class=\"label\">Next Billing Date:</span>\n          <span class=\"value\">{{ formatDate(subscription.currentPeriodEnd) }}</span>\n        </div>\n\n        <div *ngIf=\"subscription.cancelAtPeriodEnd\" class=\"info-row cancellation-notice\">\n          <span class=\"label\">⚠️ Cancellation Scheduled:</span>\n          <span class=\"value\">Ends {{ formatDate(subscription.currentPeriodEnd) }}</span>\n        </div>\n\n        <div *ngIf=\"subscription.quantity > 1\" class=\"info-row\">\n          <span class=\"label\">Quantity:</span>\n          <span class=\"value\">{{ subscription.quantity }}</span>\n        </div>\n      </div>\n\n      <!-- Upgrade Button -->\n      <button\n        *ngIf=\"showUpgradeButton && isActiveOrTrial()\"\n        class=\"upgrade-button\"\n        (click)=\"onUpgrade()\"\n      >\n        Upgrade Plan\n      </button>\n    </div>\n\n    <!-- Entitlements Section -->\n    <div *ngIf=\"showEntitlements && entitlements.length > 0\" class=\"entitlements-section\">\n      <h4 class=\"section-title\">Your Features</h4>\n      <div class=\"entitlements-list\">\n        <div\n          *ngFor=\"let entitlement of entitlements; trackBy: trackByCode\"\n          class=\"entitlement-item\"\n        >\n          <div class=\"entitlement-header\">\n            <span class=\"entitlement-name\">{{ entitlement.name }}</span>\n            <span class=\"entitlement-value\">{{ formatEntitlementValue(entitlement) }}</span>\n          </div>\n          <p *ngIf=\"entitlement.description\" class=\"entitlement-description\">\n            {{ entitlement.description }}\n          </p>\n        </div>\n      </div>\n    </div>\n\n    <!-- Usage Section -->\n    <div *ngIf=\"showUsageMeters && usageData\" class=\"usage-section\">\n      <h4 class=\"section-title\">Usage This Period</h4>\n      <div class=\"usage-content\">\n        <pre>{{ usageData | json }}</pre>\n      </div>\n    </div>\n  </div>\n\n  <!-- No Subscription State -->\n  <div *ngIf=\"!loading && !error && !subscription\" class=\"no-subscription-state\">\n    <p>No active subscription found</p>\n  </div>\n</div>\n","import { Component, Input, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject, takeUntil, forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { UsageService, EntitlementsService } from '../../services';\nimport { UsageSummary } from '../../models';\n\n/**\n * Displays usage with progress bar and optional limit warnings\n *\n * @example\n * ```html\n * <subtrak-usage-meter\n *   [meterId]=\"'meter_api_calls'\"\n *   [customerId]=\"customerId\"\n *   [limitCode]=\"'max_api_calls'\"\n *   [showOverageWarning]=\"true\"\n *   [warningThreshold]=\"0.8\">\n * </subtrak-usage-meter>\n * ```\n */\n@Component({\n  selector: 'subtrak-usage-meter',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './usage-meter.component.html',\n  styleUrl: './usage-meter.component.scss'\n})\nexport class UsageMeterComponent implements OnInit, OnDestroy, OnChanges {\n  /**\n   * Meter ID to track usage for\n   */\n  @Input({ required: true }) meterId!: string;\n\n  /**\n   * Customer ID\n   */\n  @Input({ required: true }) customerId!: string;\n\n  /**\n   * Entitlement code for the limit (optional)\n   */\n  @Input() limitCode?: string;\n\n  /**\n   * Whether to show overage warning\n   */\n  @Input() showOverageWarning = true;\n\n  /**\n   * Warning threshold (0-1), default 0.9 (90%)\n   */\n  @Input() warningThreshold = 0.9;\n\n  currentUsage: number = 0;\n  limit: number | null = null;\n  usageSummary: UsageSummary | null = null;\n  loading = true;\n  error: string | null = null;\n\n  private destroy$ = new Subject<void>();\n\n  constructor(\n    private usageService: UsageService,\n    private entitlementsService: EntitlementsService\n  ) {}\n\n  ngOnInit(): void {\n    this.loadUsageData();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (\n      (changes['meterId'] && !changes['meterId'].firstChange) ||\n      (changes['customerId'] && !changes['customerId'].firstChange) ||\n      (changes['limitCode'] && !changes['limitCode'].firstChange)\n    ) {\n      this.loadUsageData();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private loadUsageData(): void {\n    if (!this.meterId || !this.customerId) {\n      return;\n    }\n\n    this.loading = true;\n    this.error = null;\n\n    const requests: any = {\n      usage: this.usageService.getCurrentUsage(this.meterId, this.customerId).pipe(\n        catchError((err) => {\n          console.error('Failed to load usage:', err);\n          return of(null);\n        })\n      )\n    };\n\n    if (this.limitCode) {\n      requests.limit = this.entitlementsService.getLimit(this.customerId, this.limitCode).pipe(\n        catchError(() => of(null))\n      );\n    }\n\n    forkJoin(requests)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (results: any) => {\n          if (results.usage) {\n            this.usageSummary = results.usage;\n            this.currentUsage = parseFloat(results.usage.totalUsage) || 0;\n          }\n\n          if (results.limit !== undefined) {\n            this.limit = results.limit;\n          }\n\n          this.loading = false;\n        },\n        error: (err) => {\n          this.error = err.message || 'Failed to load usage data';\n          this.loading = false;\n        }\n      });\n  }\n\n  /**\n   * Get progress percentage (0-100)\n   */\n  getProgressPercentage(): number {\n    if (this.limit === null || this.limit === -1) {\n      return 0; // Unlimited or no limit\n    }\n\n    if (this.limit === 0) {\n      return 100;\n    }\n\n    const percentage = (this.currentUsage / this.limit) * 100;\n    return Math.min(percentage, 100);\n  }\n\n  /**\n   * Check if usage is approaching limit\n   */\n  isApproachingLimit(): boolean {\n    if (!this.showOverageWarning || this.limit === null || this.limit === -1) {\n      return false;\n    }\n\n    const progress = this.getProgressPercentage() / 100;\n    return progress >= this.warningThreshold;\n  }\n\n  /**\n   * Check if usage has exceeded limit\n   */\n  hasExceededLimit(): boolean {\n    if (this.limit === null || this.limit === -1) {\n      return false;\n    }\n\n    return this.currentUsage >= this.limit;\n  }\n\n  /**\n   * Get progress bar color class\n   */\n  getProgressColorClass(): string {\n    if (this.hasExceededLimit()) {\n      return 'progress-exceeded';\n    }\n\n    if (this.isApproachingLimit()) {\n      return 'progress-warning';\n    }\n\n    return 'progress-normal';\n  }\n\n  /**\n   * Get formatted usage display\n   */\n  getUsageDisplay(): string {\n    return this.currentUsage.toLocaleString();\n  }\n\n  /**\n   * Get formatted limit display\n   */\n  getLimitDisplay(): string {\n    if (this.limit === null) {\n      return 'No limit set';\n    }\n\n    if (this.limit === -1) {\n      return 'Unlimited';\n    }\n\n    return this.limit.toLocaleString();\n  }\n\n  /**\n   * Get warning message\n   */\n  getWarningMessage(): string {\n    if (this.hasExceededLimit()) {\n      return `You have exceeded your limit of ${this.getLimitDisplay()}`;\n    }\n\n    if (this.isApproachingLimit()) {\n      const remaining = this.limit! - this.currentUsage;\n      return `Approaching limit: ${remaining.toLocaleString()} remaining`;\n    }\n\n    return '';\n  }\n\n  /**\n   * Get period display text\n   */\n  getPeriodDisplay(): string {\n    if (!this.usageSummary) {\n      return '';\n    }\n\n    const start = new Date(this.usageSummary.periodStart);\n    const end = new Date(this.usageSummary.periodEnd);\n\n    const formatDate = (date: Date) =>\n      date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\n    return `${formatDate(start)} - ${formatDate(end)}`;\n  }\n}\n","<div class=\"subtrak-usage-meter\">\n  <!-- Loading State -->\n  <div *ngIf=\"loading\" class=\"loading-state\">\n    <div class=\"spinner\"></div>\n  </div>\n\n  <!-- Error State -->\n  <div *ngIf=\"error && !loading\" class=\"error-state\">\n    <span class=\"error-icon\">⚠️</span>\n    <span class=\"error-message\">{{ error }}</span>\n  </div>\n\n  <!-- Usage Data -->\n  <div *ngIf=\"!loading && !error\" class=\"usage-content\">\n    <!-- Header -->\n    <div class=\"usage-header\">\n      <div class=\"usage-stats\">\n        <span class=\"current-usage\">{{ getUsageDisplay() }}</span>\n        <span class=\"separator\">/</span>\n        <span class=\"limit\">{{ getLimitDisplay() }}</span>\n      </div>\n      <div *ngIf=\"usageSummary\" class=\"period-info\">\n        {{ getPeriodDisplay() }}\n      </div>\n    </div>\n\n    <!-- Progress Bar -->\n    <div class=\"progress-bar-container\">\n      <div\n        class=\"progress-bar\"\n        [ngClass]=\"getProgressColorClass()\"\n        [style.width.%]=\"getProgressPercentage()\"\n      ></div>\n    </div>\n\n    <!-- Progress Percentage -->\n    <div class=\"progress-percentage\">\n      {{ getProgressPercentage() | number: '1.0-0' }}% used\n    </div>\n\n    <!-- Warning Message -->\n    <div\n      *ngIf=\"showOverageWarning && (isApproachingLimit() || hasExceededLimit())\"\n      class=\"warning-message\"\n      [class.exceeded]=\"hasExceededLimit()\"\n      [class.approaching]=\"isApproachingLimit() && !hasExceededLimit()\"\n    >\n      <span class=\"warning-icon\">{{ hasExceededLimit() ? '🚫' : '⚠️' }}</span>\n      <span class=\"warning-text\">{{ getWarningMessage() }}</span>\n    </div>\n  </div>\n</div>\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EntitlementValue } from '../../models';\nimport { EntitlementChecker } from '../../utils/entitlement-checker';\n\n/**\n * Auto-formats and displays entitlement values with proper styling\n *\n * @example\n * ```html\n * <!-- Boolean Feature -->\n * <subtrak-entitlement-display\n *   [entitlement]=\"premiumAnalyticsEntitlement\">\n * </subtrak-entitlement-display>\n *\n * <!-- Numeric Limit with Progress -->\n * <subtrak-entitlement-display\n *   [entitlement]=\"maxProjectsEntitlement\"\n *   [currentValue]=\"15\"\n *   [showProgress]=\"true\">\n * </subtrak-entitlement-display>\n *\n * <!-- Enum Value -->\n * <subtrak-entitlement-display\n *   [entitlement]=\"supportTierEntitlement\">\n * </subtrak-entitlement-display>\n * ```\n */\n@Component({\n  selector: 'subtrak-entitlement-display',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './entitlement-display.component.html',\n  styleUrl: './entitlement-display.component.scss'\n})\nexport class EntitlementDisplayComponent implements OnChanges {\n  /**\n   * Entitlement to display\n   */\n  @Input({ required: true }) entitlement!: EntitlementValue;\n\n  /**\n   * Current value for numeric entitlements (to show progress)\n   */\n  @Input() currentValue?: number;\n\n  /**\n   * Whether to show progress bar for numeric entitlements\n   */\n  @Input() showProgress = false;\n\n  displayValue = '';\n  progressPercentage = 0;\n  isUnlimited = false;\n  isEnabled = false;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['entitlement'] || changes['currentValue']) {\n      this.updateDisplay();\n    }\n  }\n\n  private updateDisplay(): void {\n    if (!this.entitlement) {\n      return;\n    }\n\n    const checker = new EntitlementChecker([this.entitlement]);\n\n    // Handle BOOLEAN type\n    if (this.entitlement.type === 'BOOLEAN') {\n      this.isEnabled = this.entitlement.value === true;\n      this.displayValue = this.isEnabled ? 'Enabled' : 'Disabled';\n      return;\n    }\n\n    // Handle NUMERIC type\n    if (this.entitlement.type === 'NUMERIC') {\n      const value = this.entitlement.value as number;\n\n      if (value === -1) {\n        this.isUnlimited = true;\n        this.displayValue = 'Unlimited';\n      } else {\n        this.isUnlimited = false;\n        const unit = this.entitlement.unit ? ` ${this.entitlement.unit}` : '';\n        this.displayValue = `${value.toLocaleString()}${unit}`;\n\n        // Calculate progress if currentValue is provided\n        if (this.currentValue !== undefined && value > 0) {\n          this.progressPercentage = Math.min((this.currentValue / value) * 100, 100);\n        }\n      }\n\n      return;\n    }\n\n    // Handle ENUM type\n    if (this.entitlement.type === 'ENUM') {\n      this.displayValue = String(this.entitlement.value || '');\n      return;\n    }\n\n    // Handle METERED type\n    if (this.entitlement.type === 'METERED') {\n      this.displayValue = 'Metered';\n      return;\n    }\n\n    // Fallback\n    this.displayValue = String(this.entitlement.value || '—');\n  }\n\n  /**\n   * Get icon for boolean entitlement\n   */\n  getBooleanIcon(): string {\n    return this.isEnabled ? '✓' : '✗';\n  }\n\n  /**\n   * Get icon color class for boolean\n   */\n  getBooleanIconClass(): string {\n    return this.isEnabled ? 'icon-enabled' : 'icon-disabled';\n  }\n\n  /**\n   * Get progress bar color class\n   */\n  getProgressColorClass(): string {\n    if (this.progressPercentage >= 90) {\n      return 'progress-high';\n    }\n    if (this.progressPercentage >= 75) {\n      return 'progress-medium';\n    }\n    return 'progress-low';\n  }\n\n  /**\n   * Check if should show progress bar\n   */\n  shouldShowProgress(): boolean {\n    return (\n      this.showProgress &&\n      this.entitlement.type === 'NUMERIC' &&\n      !this.isUnlimited &&\n      this.currentValue !== undefined\n    );\n  }\n\n  /**\n   * Get current value display\n   */\n  getCurrentValueDisplay(): string {\n    if (this.currentValue === undefined) {\n      return '';\n    }\n\n    const unit = this.entitlement.unit ? ` ${this.entitlement.unit}` : '';\n    return `${this.currentValue.toLocaleString()}${unit}`;\n  }\n\n  /**\n   * Get remaining value for numeric entitlements\n   */\n  getRemainingDisplay(): string {\n    if (\n      this.entitlement.type !== 'NUMERIC' ||\n      this.currentValue === undefined ||\n      this.isUnlimited\n    ) {\n      return '';\n    }\n\n    const limit = this.entitlement.value as number;\n    const remaining = Math.max(0, limit - this.currentValue);\n    const unit = this.entitlement.unit ? ` ${this.entitlement.unit}` : '';\n\n    return `${remaining.toLocaleString()}${unit} remaining`;\n  }\n\n  /**\n   * Check if current value exceeds limit\n   */\n  isOverLimit(): boolean {\n    if (\n      this.entitlement.type !== 'NUMERIC' ||\n      this.currentValue === undefined ||\n      this.isUnlimited\n    ) {\n      return false;\n    }\n\n    const limit = this.entitlement.value as number;\n    return this.currentValue > limit;\n  }\n}\n","<div class=\"subtrak-entitlement-display\" *ngIf=\"entitlement\">\n  <!-- Header -->\n  <div class=\"entitlement-header\">\n    <div class=\"entitlement-info\">\n      <h4 class=\"entitlement-name\">{{ entitlement.name }}</h4>\n      <p *ngIf=\"entitlement.description\" class=\"entitlement-description\">\n        {{ entitlement.description }}\n      </p>\n    </div>\n\n    <!-- Value Display -->\n    <div class=\"entitlement-value\">\n      <!-- Boolean Type -->\n      <span\n        *ngIf=\"entitlement.type === 'BOOLEAN'\"\n        class=\"boolean-value\"\n        [ngClass]=\"getBooleanIconClass()\"\n      >\n        <span class=\"boolean-icon\">{{ getBooleanIcon() }}</span>\n        <span class=\"boolean-text\">{{ displayValue }}</span>\n      </span>\n\n      <!-- Numeric Type -->\n      <span *ngIf=\"entitlement.type === 'NUMERIC'\" class=\"numeric-value\">\n        <span class=\"value-text\" [class.unlimited]=\"isUnlimited\">{{ displayValue }}</span>\n      </span>\n\n      <!-- Enum Type -->\n      <span *ngIf=\"entitlement.type === 'ENUM'\" class=\"enum-value\">\n        {{ displayValue }}\n      </span>\n\n      <!-- Metered Type -->\n      <span *ngIf=\"entitlement.type === 'METERED'\" class=\"metered-value\">\n        {{ displayValue }}\n      </span>\n    </div>\n  </div>\n\n  <!-- Progress Bar (for Numeric with currentValue) -->\n  <div *ngIf=\"shouldShowProgress()\" class=\"progress-section\">\n    <div class=\"progress-info\">\n      <span class=\"current-value\">{{ getCurrentValueDisplay() }}</span>\n      <span class=\"separator\">/</span>\n      <span class=\"limit-value\">{{ displayValue }}</span>\n    </div>\n\n    <div class=\"progress-bar-container\">\n      <div\n        class=\"progress-bar\"\n        [ngClass]=\"getProgressColorClass()\"\n        [style.width.%]=\"progressPercentage\"\n      ></div>\n    </div>\n\n    <div class=\"progress-footer\">\n      <span *ngIf=\"!isOverLimit()\" class=\"remaining-text\">{{ getRemainingDisplay() }}</span>\n      <span *ngIf=\"isOverLimit()\" class=\"over-limit-text\">⚠️ Over limit</span>\n      <span class=\"percentage-text\">{{ progressPercentage | number: '1.0-0' }}%</span>\n    </div>\n  </div>\n\n  <!-- Category Badge -->\n  <div class=\"category-badge\" [ngClass]=\"'category-' + entitlement.category.toLowerCase()\">\n    {{ entitlement.category }}\n  </div>\n</div>\n","import { Component, Input, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject, takeUntil, forkJoin, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport {\n  SubscriptionsService,\n  PaymentMethodsService,\n  InvoicesService,\n  UsageService\n} from '../../services';\nimport {\n  SubscriptionWithRelations,\n  PaymentMethod,\n  Invoice,\n  UsageSummary\n} from '../../models';\nimport { SubscriptionStatusComponent } from '../subscription-status/subscription-status.component';\n\n/**\n * Complete billing management widget with subscription, payment methods, and invoices\n *\n * @example\n * ```html\n * <subtrak-billing-portal\n *   [customerId]=\"currentCustomerId\">\n * </subtrak-billing-portal>\n * ```\n */\n@Component({\n  selector: 'subtrak-billing-portal',\n  standalone: true,\n  imports: [CommonModule, SubscriptionStatusComponent],\n  templateUrl: './billing-portal.component.html',\n  styleUrl: './billing-portal.component.scss'\n})\nexport class BillingPortalComponent implements OnInit, OnDestroy, OnChanges {\n  /**\n   * Customer ID to display billing information for\n   */\n  @Input({ required: true }) customerId!: string;\n\n  subscription: SubscriptionWithRelations | null = null;\n  paymentMethods: PaymentMethod[] = [];\n  recentInvoices: Invoice[] = [];\n  usageSummaries: UsageSummary[] = [];\n  loading = true;\n  error: string | null = null;\n\n  // Section loading states\n  loadingPaymentMethods = false;\n  loadingInvoices = false;\n\n  private destroy$ = new Subject<void>();\n\n  constructor(\n    private subscriptionsService: SubscriptionsService,\n    private paymentMethodsService: PaymentMethodsService,\n    private invoicesService: InvoicesService,\n    private usageService: UsageService\n  ) {}\n\n  ngOnInit(): void {\n    this.loadBillingData();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['customerId'] && !changes['customerId'].firstChange) {\n      this.loadBillingData();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  public loadBillingData(): void {\n    if (!this.customerId) {\n      return;\n    }\n\n    this.loading = true;\n    this.error = null;\n\n    // Load all data in parallel\n    forkJoin({\n      subscription: this.subscriptionsService.getCurrentSubscription(this.customerId).pipe(\n        catchError(() => of(null))\n      ),\n      paymentMethods: this.paymentMethodsService.listPaymentMethods(this.customerId).pipe(\n        catchError(() => of([]))\n      ),\n      invoices: this.invoicesService.listInvoices({\n        customerId: this.customerId,\n        page: 1,\n        limit: 5\n      }).pipe(\n        catchError(() => of({ data: [], pagination: { total: 0, pages: 0, currentPage: 1, perPage: 5 } }))\n      )\n    })\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (results) => {\n          this.subscription = results.subscription;\n          this.paymentMethods = results.paymentMethods;\n          this.recentInvoices = results.invoices.data;\n\n          // Load usage data if subscription exists\n          if (this.subscription) {\n            this.loadUsageData(this.subscription.id);\n          } else {\n            this.loading = false;\n          }\n        },\n        error: (err) => {\n          this.error = err.message || 'Failed to load billing data';\n          this.loading = false;\n        }\n      });\n  }\n\n  private loadUsageData(subscriptionId: string): void {\n    this.usageService\n      .getSubscriptionUsage(subscriptionId)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (summaries) => {\n          this.usageSummaries = summaries;\n          this.loading = false;\n        },\n        error: () => {\n          this.loading = false;\n        }\n      });\n  }\n\n  /**\n   * Handle upgrade button click\n   */\n  onUpgradeClicked(): void {\n    // Emit event or navigate to pricing page\n    console.log('Upgrade clicked for customer:', this.customerId);\n  }\n\n  /**\n   * Remove a payment method\n   */\n  removePaymentMethod(paymentMethodId: string): void {\n    if (!confirm('Are you sure you want to remove this payment method?')) {\n      return;\n    }\n\n    this.loadingPaymentMethods = true;\n\n    this.paymentMethodsService\n      .removePaymentMethod(paymentMethodId)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: () => {\n          this.paymentMethods = this.paymentMethods.filter(pm => pm.id !== paymentMethodId);\n          this.loadingPaymentMethods = false;\n        },\n        error: (err: any) => {\n          alert(`Failed to remove payment method: ${err.message}`);\n          this.loadingPaymentMethods = false;\n        }\n      });\n  }\n\n  /**\n   * Set payment method as default\n   */\n  setDefaultPaymentMethod(paymentMethodId: string): void {\n    this.loadingPaymentMethods = true;\n\n    this.paymentMethodsService\n      .setDefaultPaymentMethod(paymentMethodId)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: () => {\n          // Update local state\n          this.paymentMethods = this.paymentMethods.map(pm => ({\n            ...pm,\n            isDefault: pm.id === paymentMethodId\n          }));\n          this.loadingPaymentMethods = false;\n        },\n        error: (err) => {\n          alert(`Failed to set default payment method: ${err.message}`);\n          this.loadingPaymentMethods = false;\n        }\n      });\n  }\n\n  /**\n   * Get payment method display text\n   */\n  getPaymentMethodDisplay(pm: PaymentMethod): string {\n    if (pm.type === 'card' && pm.cardBrand && pm.cardLast4) {\n      return `${pm.cardBrand} •••• ${pm.cardLast4}`;\n    }\n    return pm.type || 'Payment Method';\n  }\n\n  /**\n   * Get payment method expiry display\n   */\n  getExpiryDisplay(pm: PaymentMethod): string {\n    if (pm.cardExpMonth && pm.cardExpYear) {\n      return `Expires ${String(pm.cardExpMonth).padStart(2, '0')}/${pm.cardExpYear}`;\n    }\n    return '';\n  }\n\n  /**\n   * Format invoice date\n   */\n  formatDate(dateString: string): string {\n    const date = new Date(dateString);\n    return date.toLocaleDateString('en-US', {\n      year: 'numeric',\n      month: 'short',\n      day: 'numeric'\n    });\n  }\n\n  /**\n   * Format currency amount\n   */\n  formatAmount(amount: string, currency: string): string {\n    const value = parseFloat(amount);\n    return new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency: currency.toUpperCase(),\n      minimumFractionDigits: 2\n    }).format(value);\n  }\n\n  /**\n   * Get invoice status class\n   */\n  getInvoiceStatusClass(status: string): string {\n    return `status-${status.toLowerCase()}`;\n  }\n\n  /**\n   * Download invoice PDF\n   */\n  downloadInvoice(invoice: Invoice): void {\n    if (!invoice.pdfUrl) {\n      alert('PDF not available for this invoice');\n      return;\n    }\n\n    // Open PDF in new tab\n    window.open(invoice.pdfUrl, '_blank');\n  }\n\n  /**\n   * Format usage value\n   */\n  formatUsage(value: string): string {\n    return parseFloat(value).toLocaleString();\n  }\n\n  /**\n   * Track by function for payment methods\n   */\n  trackByPaymentMethodId(index: number, pm: PaymentMethod): string {\n    return pm.id;\n  }\n\n  /**\n   * Track by function for invoices\n   */\n  trackByInvoiceId(index: number, invoice: Invoice): string {\n    return invoice.id;\n  }\n\n  /**\n   * Track by function for usage summaries\n   */\n  trackByUsageId(index: number, usage: UsageSummary): string {\n    return usage.id;\n  }\n}\n","<div class=\"subtrak-billing-portal\">\n  <!-- Loading State -->\n  <div *ngIf=\"loading\" class=\"loading-state\">\n    <div class=\"spinner\"></div>\n    <p>Loading billing information...</p>\n  </div>\n\n  <!-- Error State -->\n  <div *ngIf=\"error && !loading\" class=\"error-state\">\n    <div class=\"error-icon\">⚠️</div>\n    <p class=\"error-message\">{{ error }}</p>\n    <button class=\"retry-button\" (click)=\"loadBillingData()\">Retry</button>\n  </div>\n\n  <!-- Billing Portal Content -->\n  <div *ngIf=\"!loading && !error\" class=\"portal-content\">\n\n    <!-- Subscription Section -->\n    <section class=\"portal-section\">\n      <h2 class=\"section-title\">Current Subscription</h2>\n      <subtrak-subscription-status\n        [customerId]=\"customerId\"\n        [showEntitlements]=\"true\"\n        [showUsageMeters]=\"false\"\n        [showUpgradeButton]=\"true\"\n        (upgradeClicked)=\"onUpgradeClicked()\">\n      </subtrak-subscription-status>\n    </section>\n\n    <!-- Payment Methods Section -->\n    <section class=\"portal-section\">\n      <div class=\"section-header\">\n        <h2 class=\"section-title\">Payment Methods</h2>\n        <button class=\"add-button\">+ Add Payment Method</button>\n      </div>\n\n      <div *ngIf=\"loadingPaymentMethods\" class=\"section-loading\">\n        <div class=\"spinner-small\"></div>\n      </div>\n\n      <div *ngIf=\"!loadingPaymentMethods && paymentMethods.length === 0\" class=\"empty-state\">\n        <p>No payment methods on file</p>\n        <button class=\"add-button-large\">Add Payment Method</button>\n      </div>\n\n      <div *ngIf=\"!loadingPaymentMethods && paymentMethods.length > 0\" class=\"payment-methods-list\">\n        <div\n          *ngFor=\"let pm of paymentMethods; trackBy: trackByPaymentMethodId\"\n          class=\"payment-method-item\"\n          [class.default]=\"pm.isDefault\"\n        >\n          <div class=\"pm-icon\">💳</div>\n          <div class=\"pm-details\">\n            <div class=\"pm-name\">{{ getPaymentMethodDisplay(pm) }}</div>\n            <div class=\"pm-expiry\">{{ getExpiryDisplay(pm) }}</div>\n          </div>\n          <div class=\"pm-badges\">\n            <span *ngIf=\"pm.isDefault\" class=\"default-badge\">Default</span>\n          </div>\n          <div class=\"pm-actions\">\n            <button\n              *ngIf=\"!pm.isDefault\"\n              class=\"action-button set-default\"\n              (click)=\"setDefaultPaymentMethod(pm.id)\"\n            >\n              Set as Default\n            </button>\n            <button\n              class=\"action-button remove\"\n              (click)=\"removePaymentMethod(pm.id)\"\n              [disabled]=\"pm.isDefault && paymentMethods.length === 1\"\n            >\n              Remove\n            </button>\n          </div>\n        </div>\n      </div>\n    </section>\n\n    <!-- Invoices Section -->\n    <section class=\"portal-section\">\n      <div class=\"section-header\">\n        <h2 class=\"section-title\">Recent Invoices</h2>\n        <a href=\"#\" class=\"view-all-link\">View All</a>\n      </div>\n\n      <div *ngIf=\"loadingInvoices\" class=\"section-loading\">\n        <div class=\"spinner-small\"></div>\n      </div>\n\n      <div *ngIf=\"!loadingInvoices && recentInvoices.length === 0\" class=\"empty-state\">\n        <p>No invoices yet</p>\n      </div>\n\n      <div *ngIf=\"!loadingInvoices && recentInvoices.length > 0\" class=\"invoices-table\">\n        <table>\n          <thead>\n            <tr>\n              <th>Invoice</th>\n              <th>Date</th>\n              <th>Amount</th>\n              <th>Status</th>\n              <th>Actions</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr *ngFor=\"let invoice of recentInvoices; trackBy: trackByInvoiceId\">\n              <td class=\"invoice-number\">{{ invoice.invoiceNumber }}</td>\n              <td>{{ formatDate(invoice.issueDate) }}</td>\n              <td class=\"amount\">{{ formatAmount(invoice.total, invoice.currency) }}</td>\n              <td>\n                <span class=\"status-badge\" [ngClass]=\"getInvoiceStatusClass(invoice.status)\">\n                  {{ invoice.status }}\n                </span>\n              </td>\n              <td>\n                <button\n                  *ngIf=\"invoice.pdfUrl\"\n                  class=\"download-button\"\n                  (click)=\"downloadInvoice(invoice)\"\n                >\n                  Download PDF\n                </button>\n              </td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </section>\n\n    <!-- Usage Section -->\n    <section *ngIf=\"usageSummaries.length > 0\" class=\"portal-section\">\n      <h2 class=\"section-title\">Usage This Period</h2>\n\n      <div class=\"usage-grid\">\n        <div\n          *ngFor=\"let usage of usageSummaries; trackBy: trackByUsageId\"\n          class=\"usage-card\"\n        >\n          <div class=\"usage-label\">Meter ID: {{ usage.meterId }}</div>\n          <div class=\"usage-value\">{{ formatUsage(usage.totalUsage) }}</div>\n          <div *ngIf=\"usage.billableUnits !== '0'\" class=\"billable-units\">\n            Billable: {{ formatUsage(usage.billableUnits) }}\n          </div>\n        </div>\n      </div>\n    </section>\n  </div>\n</div>\n","import { Component, OnInit, OnDestroy, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, PLATFORM_ID, Inject } from '@angular/core';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { Subject, takeUntil } from 'rxjs';\nimport { SubtrakService } from '../../services/subtrak.service';\nimport { PaymentMethodsService } from '../../services/payment-methods.service';\nimport { PaymentMethod, PaymentProvider, PaymentProviderConfig, Customer } from '../../models';\n\n/**\n * PaymentProviderCardComponent\n *\n * Automatically detects and renders the appropriate payment provider (Stripe/Paymob)\n * based on customer country and tenant's configured payment providers.\n *\n * Features:\n * - Automatic provider detection based on country\n * - Dynamic Stripe Elements rendering\n * - Dynamic Paymob iframe rendering\n * - Tenant-specific publishable keys\n * - Tokenization and payment method creation\n * - Loading and error states\n * - Responsive design\n *\n * @example\n * ```html\n * <!-- Auto-detect country from customer data -->\n * <subtrak-payment-provider-card\n *   [customerId]=\"currentUser.id\"\n *   (paymentMethodAdded)=\"onPaymentMethodAdded($event)\"\n *   (error)=\"onError($event)\">\n * </subtrak-payment-provider-card>\n *\n * <!-- Or specify country explicitly -->\n * <subtrak-payment-provider-card\n *   [customerId]=\"currentUser.id\"\n *   [countryCode]=\"'US'\"\n *   (paymentMethodAdded)=\"onPaymentMethodAdded($event)\"\n *   (error)=\"onError($event)\">\n * </subtrak-payment-provider-card>\n *\n * <!-- Paymob: Payment with amount (required for Paymob) -->\n * <subtrak-payment-provider-card\n *   [customerId]=\"currentUser.id\"\n *   [amount]=\"100\"\n *   [currency]=\"'EGP'\"\n *   [description]=\"'Order #12345'\"\n *   (paymentMethodAdded)=\"onPaymentMethodAdded($event)\"\n *   (error)=\"onError($event)\">\n * </subtrak-payment-provider-card>\n * ```\n */\n@Component({\n  selector: 'subtrak-payment-provider-card',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './payment-provider-card.component.html',\n  styleUrls: ['./payment-provider-card.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PaymentProviderCardComponent implements OnInit, OnDestroy {\n  /**\n   * Customer ID for the payment method\n   */\n  @Input() customerId!: string;\n\n  /**\n   * Customer's country code (ISO 3166-1 alpha-2)\n   * Used to determine the appropriate payment provider\n   * If not provided, will be automatically fetched from customer data\n   */\n  @Input() countryCode?: string;\n\n  /**\n   * Optional: Force a specific provider instead of auto-detection\n   */\n  @Input() provider?: PaymentProvider;\n\n  /**\n   * Optional: Payment amount (required for Paymob)\n   * For Stripe: If not provided, creates a payment method for future use\n   * For Paymob: Required to create payment intent\n   */\n  @Input() amount?: number;\n\n  /**\n   * Optional: Payment currency (required for Paymob)\n   * Examples: 'EGP' (Egypt), 'SAR' (Saudi Arabia), 'AED' (UAE), 'USD', 'EUR'\n   */\n  @Input() currency?: string;\n\n  /**\n   * Optional: Payment description\n   */\n  @Input() description?: string;\n\n  /**\n   * Optional: Redirect URL after payment completion (Paymob only)\n   * Where to redirect the user after successful payment\n   * Example: 'https://yourapp.com/payment-success'\n   */\n  @Input() redirectUrl?: string;\n\n  /**\n   * Emitted when a payment method is successfully added\n   */\n  @Output() paymentMethodAdded = new EventEmitter<PaymentMethod>();\n\n  /**\n   * Emitted when an error occurs\n   */\n  @Output() error = new EventEmitter<Error>();\n\n  /**\n   * Emitted when the component is loading\n   */\n  @Output() loadingChange = new EventEmitter<boolean>();\n\n  // State\n  loading = true;\n  errorMessage: string | null = null;\n  detectedProvider: PaymentProvider | null = null;\n  providerConfig: PaymentProviderConfig | null = null;\n  isProcessing = false;\n\n  // Saved Payment Methods\n  savedPaymentMethods: PaymentMethod[] = [];\n  selectedPaymentMethodId: string | null = null;\n  showNewCardForm = false;\n  loadingSavedMethods = false;\n\n  // Stripe\n  private stripe: any;\n  private stripeElements: any;\n  private stripeCardElement: any;\n\n  // Paymob\n  paymobIframeUrl: SafeResourceUrl | null = null;\n  paymobClientSecret: string | null = null;\n  private paymobCardElement: any;\n\n  private destroy$ = new Subject<void>();\n  private isBrowser: boolean;\n\n  constructor(\n    private subtrak: SubtrakService,\n    private paymentMethods: PaymentMethodsService,\n    private cdr: ChangeDetectorRef,\n    private sanitizer: DomSanitizer,\n    @Inject(PLATFORM_ID) platformId: object\n  ) {\n    this.isBrowser = isPlatformBrowser(platformId);\n  }\n\n  ngOnInit(): void {\n    if (!this.customerId) {\n      this.handleError(new Error('customerId is required'));\n      return;\n    }\n\n    // First, load saved payment methods\n    this.loadSavedPaymentMethods();\n    this.initializePaymentProvider();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n\n    // Cleanup Stripe elements\n    if (this.stripeCardElement) {\n      this.stripeCardElement.destroy();\n    }\n\n    // Cleanup Paymob elements\n    if (this.paymobCardElement) {\n      this.paymobCardElement.destroy();\n    }\n  }\n\n  private async initializePaymentProvider(): Promise<void> {\n    try {\n      this.setLoading(true);\n\n      // Fetch country code from customer if not provided\n      if (!this.countryCode) {\n        await this.fetchCustomerCountry();\n      }\n\n      // Detect provider based on country or use forced provider\n      this.detectedProvider = this.provider || this.detectProviderByCountry(this.countryCode);\n\n      // Fetch provider configuration from API\n      await this.fetchProviderConfig();\n\n      // Initialize the appropriate provider\n      if (this.detectedProvider === PaymentProvider.STRIPE) {\n        await this.initializeStripe();\n      } else if (this.isPaymobProvider(this.detectedProvider)) {\n        await this.initializePaymob();\n      } else {\n        throw new Error(`Unsupported payment provider: ${this.detectedProvider}`);\n      }\n\n      this.setLoading(false);\n    } catch (err) {\n      this.handleError(err as Error);\n    }\n  }\n\n  /**\n   * Load saved payment methods for the customer\n   */\n  private loadSavedPaymentMethods(): void {\n    this.loadingSavedMethods = true;\n    this.cdr.detectChanges();\n\n    this.paymentMethods.listPaymentMethods(this.customerId)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (methods) => {\n          this.savedPaymentMethods = methods;\n\n          // Auto-select default payment method if exists\n          const defaultMethod = methods.find(m => m.isDefault);\n          if (defaultMethod) {\n            this.selectedPaymentMethodId = defaultMethod.id;\n            this.showNewCardForm = false;\n          } else if (methods.length > 0) {\n            // Select first card if no default\n            this.selectedPaymentMethodId = methods[0].id;\n            this.showNewCardForm = false;\n          } else {\n            // No saved cards, show form by default\n            this.showNewCardForm = true;\n            this.selectedPaymentMethodId = null;\n          }\n\n          this.loadingSavedMethods = false;\n          this.cdr.detectChanges();\n        },\n        error: (err) => {\n          console.warn('Failed to load saved payment methods:', err);\n          this.loadingSavedMethods = false;\n          this.showNewCardForm = true;\n          this.cdr.detectChanges();\n        }\n      });\n  }\n\n  /**\n   * Select a saved payment method\n   */\n  selectPaymentMethod(methodId: string | undefined): void {\n    if (!methodId) {\n      // User wants to add new card\n      this.selectedPaymentMethodId = null;\n      this.showNewCardForm = true;\n    } else {\n      this.selectedPaymentMethodId = methodId;\n      this.showNewCardForm = false;\n    }\n    this.cdr.detectChanges();\n  }\n\n  /**\n   * Use selected saved payment method (emit it)\n   */\n  useSavedPaymentMethod(): void {\n    if (!this.selectedPaymentMethodId) return;\n\n    const method = this.savedPaymentMethods.find(m => m.id === this.selectedPaymentMethodId);\n    if (method) {\n      this.paymentMethodAdded.emit(method);\n    }\n  }\n\n  /**\n   * Get display text for card brand\n   */\n  getCardBrandIcon(brand: string | null | undefined): string {\n    const icons: Record<string, string> = {\n      'visa': 'VISA',\n      'mastercard': 'MC',\n      'amex': 'AMEX',\n      'discover': 'DISC'\n    };\n    return icons[(brand || '').toLowerCase()] || brand?.toUpperCase() || 'CARD';\n  }\n\n  private async fetchCustomerCountry(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      this.subtrak.get<Customer>(`/customers/${this.customerId}`)\n        .pipe(takeUntil(this.destroy$))\n        .subscribe({\n          next: (customer) => {\n            this.countryCode = customer.countryCode;\n            resolve();\n          },\n          error: (err) => {\n            console.warn('Failed to fetch customer country, defaulting to Stripe:', err);\n            // Default to Stripe if customer fetch fails\n            this.countryCode = undefined;\n            resolve();\n          }\n        });\n    });\n  }\n\n  private detectProviderByCountry(countryCode?: string): PaymentProvider {\n    if (!countryCode) {\n      return PaymentProvider.STRIPE; // Default to Stripe\n    }\n\n    // MENA region countries → Paymob\n    const paymobCountries: Record<string, PaymentProvider> = {\n      'EG': PaymentProvider.PAYMOB_EGYPT,\n      'SA': PaymentProvider.PAYMOB_KSA,\n      'AE': PaymentProvider.PAYMOB_UAE,\n      'OM': PaymentProvider.PAYMOB_OMAN,\n      'PK': PaymentProvider.PAYMOB_PAKISTAN\n    };\n\n    return paymobCountries[countryCode.toUpperCase()] || PaymentProvider.STRIPE;\n  }\n\n  private isPaymobProvider(provider: PaymentProvider | null): boolean {\n    if (!provider) return false;\n    return provider.toString().startsWith('PAYMOB_');\n  }\n\n  private async fetchProviderConfig(): Promise<void> {\n    // Fetch tenant's payment provider configuration from API\n    // This includes the publishable key for the detected provider\n    return new Promise((resolve, reject) => {\n      this.subtrak.get<{ providers: PaymentProviderConfig[] }>('/payment-providers/config')\n        .pipe(takeUntil(this.destroy$))\n        .subscribe({\n          next: (response) => {\n            const config = response.providers.find(p =>\n              p.provider === this.detectedProvider && p.isActive\n            );\n\n            if (!config) {\n              reject(new Error(`Payment provider ${this.detectedProvider} is not configured or inactive`));\n              return;\n            }\n\n            this.providerConfig = config;\n            resolve();\n          },\n          error: (err) => reject(err)\n        });\n    });\n  }\n\n  private async initializeStripe(): Promise<void> {\n    if (!this.isBrowser) return;\n\n    // Load Stripe.js dynamically\n    await this.loadStripeScript();\n\n    if (!this.providerConfig?.publishableKey) {\n      throw new Error('Stripe publishable key not found');\n    }\n\n    // Initialize Stripe instance\n    this.stripe = (window as any).Stripe(this.providerConfig.publishableKey);\n\n    // Create Elements instance\n    this.stripeElements = this.stripe.elements();\n\n    // Create Card Element\n    this.stripeCardElement = this.stripeElements.create('card', {\n      style: {\n        base: {\n          fontSize: '16px',\n          color: '#32325d',\n          fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n          '::placeholder': {\n            color: '#aab7c4'\n          }\n        },\n        invalid: {\n          color: '#fa755a',\n          iconColor: '#fa755a'\n        }\n      }\n    });\n\n    // Mount to DOM\n    setTimeout(() => {\n      const cardContainer = document.getElementById('stripe-card-element');\n      if (cardContainer) {\n        this.stripeCardElement.mount('#stripe-card-element');\n      }\n      this.cdr.detectChanges();\n    }, 100);\n  }\n\n  private async initializePaymob(): Promise<void> {\n    if (!this.providerConfig?.publishableKey) {\n      throw new Error('Paymob API key not found');\n    }\n\n    // Validate required inputs for Paymob\n    if (!this.amount || this.amount <= 0) {\n      throw new Error('Paymob requires a valid amount. Please provide the [amount] input.');\n    }\n\n    if (!this.currency) {\n      throw new Error('Paymob requires a currency. Please provide the [currency] input (e.g., \"EGP\", \"SAR\", \"AED\").');\n    }\n\n    try {\n      // Create payment intent on backend\n      const response = await fetch(`${this.subtrak.config.apiUrl}/payment-providers/paymob/create-intent`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': `Bearer ${this.subtrak.config.publicKey}`\n        },\n        body: JSON.stringify({\n          customer_id: this.customerId,\n          amount: this.amount,\n          currency: this.currency,\n          description: this.description || 'Payment',\n          redirect_url: this.redirectUrl // Optional: merchant's success page\n        })\n      });\n\n      if (!response.ok) {\n        const error = await response.json();\n        throw new Error(error.error || 'Failed to create Paymob payment intent');\n      }\n\n      const data = await response.json();\n\n      // Check if we have clientSecret (Paymob Pixel) or payment URL (iframe)\n      if (data.clientSecret || data.client_secret) {\n        // Paymob Pixel approach - use client secret for tokenization\n        this.paymobClientSecret = data.clientSecret || data.client_secret;\n        console.log('✅ Paymob Pixel: Client secret received');\n\n        // Load Paymob Pixel SDK and initialize card form\n        await this.loadPaymobPixelScript();\n        await this.initializePaymobPixel();\n        this.cdr.detectChanges();\n      } else if (data.payment_url || data.iframe_url || data.paymentUrl) {\n        // Iframe approach - use payment URL\n        const paymentUrl = data.payment_url || data.iframe_url || data.paymentUrl;\n        this.paymobIframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(paymentUrl);\n        console.log('✅ Paymob iframe initialized with URL');\n        this.cdr.detectChanges();\n      } else {\n        throw new Error('No payment URL or client secret received from Paymob');\n      }\n    } catch (err: any) {\n      throw new Error(`Paymob initialization failed: ${err.message}`);\n    }\n  }\n\n  private async loadStripeScript(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if ((window as any).Stripe) {\n        resolve();\n        return;\n      }\n\n      const script = document.createElement('script');\n      script.src = 'https://js.stripe.com/v3/';\n      script.async = true;\n      script.onload = () => resolve();\n      script.onerror = () => reject(new Error('Failed to load Stripe.js'));\n      document.head.appendChild(script);\n    });\n  }\n\n  private async loadPaymobPixelScript(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if ((window as any).Pixel) {\n        resolve();\n        return;\n      }\n\n      // Load stylesheets first\n      const loadStylesheet = (href: string) => {\n        const link = document.createElement('link');\n        link.rel = 'stylesheet';\n        link.href = href;\n        document.head.appendChild(link);\n        return link;\n      };\n\n      loadStylesheet('https://unpkg.com/paymob-pixel/main.css');\n      loadStylesheet('https://unpkg.com/paymob-pixel/styles.css');\n\n      // Load Paymob Pixel SDK from unpkg\n      const script = document.createElement('script');\n      script.src = 'https://unpkg.com/paymob-pixel/main.js';\n      script.type = 'module';\n      script.async = true;\n\n      script.onload = () => {\n        console.log('Paymob Pixel SDK loaded successfully');\n        // Wait for Pixel class to be available on window\n        const checkPixel = setInterval(() => {\n          if ((window as any).Pixel) {\n            clearInterval(checkPixel);\n            resolve();\n          }\n        }, 100);\n\n        // Timeout after 10 seconds\n        setTimeout(() => {\n          clearInterval(checkPixel);\n          if (!(window as any).Pixel) {\n            reject(new Error('Failed to load Paymob Pixel SDK (timeout)'));\n          }\n        }, 10000);\n      };\n\n      script.onerror = () => reject(new Error('Failed to load Paymob Pixel SDK'));\n      document.head.appendChild(script);\n    });\n  }\n\n  private async initializePaymobPixel(): Promise<void> {\n    if (!this.isBrowser) return;\n\n    if (!this.providerConfig?.publishableKey) {\n      throw new Error('Paymob public key not found');\n    }\n\n    if (!this.paymobClientSecret) {\n      throw new Error('Paymob client secret not found');\n    }\n\n    try {\n      const PixelClass = (window as any).Pixel;\n\n      if (!PixelClass) {\n        throw new Error('Pixel class not available');\n      }\n\n      console.log('Initializing Paymob Pixel with:', {\n        publicKey: this.providerConfig.publishableKey.substring(0, 20) + '...',\n        clientSecret: this.paymobClientSecret.substring(0, 20) + '...',\n        elementId: 'paymob-card-element',\n      });\n\n      // Initialize Paymob Pixel with constructor configuration\n      this.paymobCardElement = new PixelClass({\n        publicKey: this.providerConfig.publishableKey,\n        clientSecret: this.paymobClientSecret,\n        paymentMethods: ['card'], // Can also include 'google-pay', 'apple-pay'\n        elementId: 'paymob-card-element',\n        beforePaymentComplete: () => {\n          console.log('Paymob: Payment is being processed...');\n          return true; // Allow payment to proceed\n        },\n        afterPaymentComplete: (data: any) => {\n          console.log('Paymob: Payment completed successfully', data);\n          const transactionId = data?.id || data?.transaction_id || data?.txn_response_code;\n\n          // Emit success event with transaction data\n          this.paymentMethodAdded.emit({\n            id: transactionId,\n            provider: this.detectedProvider!,\n            ...data\n          } as any);\n        },\n        onError: (err: any) => {\n          console.error('Paymob: Payment error', err);\n          const errorMsg = err?.message || err?.error || 'Payment failed';\n          this.handleError(new Error(errorMsg));\n        },\n      });\n\n      // Render the payment form\n      this.paymobCardElement.render();\n      console.log('✅ Paymob Pixel rendered successfully');\n      this.cdr.detectChanges();\n    } catch (err: any) {\n      console.error('Paymob Pixel initialization error:', err);\n      throw new Error(err.message || 'Failed to initialize payment form');\n    }\n  }\n\n  async submitPayment(): Promise<void> {\n    if (this.isProcessing || !this.providerConfig) return;\n\n    try {\n      this.isProcessing = true;\n      this.errorMessage = null;\n      this.cdr.detectChanges();\n\n      if (this.detectedProvider === PaymentProvider.STRIPE) {\n        await this.submitStripePayment();\n      } else if (this.isPaymobProvider(this.detectedProvider)) {\n        await this.submitPaymobPayment();\n      }\n    } catch (err) {\n      this.handleError(err as Error);\n    } finally {\n      this.isProcessing = false;\n      this.cdr.detectChanges();\n    }\n  }\n\n  private async submitStripePayment(): Promise<void> {\n    if (!this.stripe || !this.stripeCardElement) {\n      throw new Error('Stripe not initialized');\n    }\n\n    // Create payment method with Stripe\n    const { paymentMethod, error: stripeError } = await this.stripe.createPaymentMethod({\n      type: 'card',\n      card: this.stripeCardElement\n    });\n\n    if (stripeError) {\n      throw new Error(stripeError.message);\n    }\n\n    // Add payment method via Subtrak API\n    const provider = (this.detectedProvider || 'STRIPE').toString();\n    this.paymentMethods.addPaymentMethod(this.customerId, provider, paymentMethod.id, 'card')\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (addedMethod) => {\n          this.paymentMethodAdded.emit(addedMethod);\n          // Clear the card element\n          this.stripeCardElement.clear();\n        },\n        error: (err) => this.handleError(err)\n      });\n  }\n\n  private async submitPaymobPayment(): Promise<void> {\n    // Paymob Pixel handles payment submission automatically through its UI\n    // The afterPaymentComplete callback will be triggered when payment succeeds\n    // No manual submission needed - the Pixel SDK manages the entire flow\n    console.log('Paymob Pixel: Payment will be submitted through the Pixel UI');\n  }\n\n  private setLoading(loading: boolean): void {\n    this.loading = loading;\n    this.loadingChange.emit(loading);\n    this.cdr.detectChanges();\n  }\n\n  private handleError(err: Error): void {\n    this.errorMessage = err.message;\n    this.error.emit(err);\n    this.setLoading(false);\n  }\n\n  // Public getters for template\n  get isStripe(): boolean {\n    return this.detectedProvider === PaymentProvider.STRIPE;\n  }\n\n  get isPaymob(): boolean {\n    return this.isPaymobProvider(this.detectedProvider);\n  }\n\n  get providerName(): string {\n    if (!this.detectedProvider) return '';\n    return this.detectedProvider.replace('PAYMOB_', 'Paymob ').replace('_', ' ');\n  }\n}\n","<div class=\"payment-provider-card\">\n  <!-- Loading State -->\n  <div *ngIf=\"loading || loadingSavedMethods\" class=\"loading-state\">\n    <div class=\"spinner\"></div>\n    <p>Loading payment options...</p>\n  </div>\n\n  <!-- Error State -->\n  <div *ngIf=\"errorMessage && !loading\" class=\"error-state\">\n    <svg class=\"error-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n      <circle cx=\"12\" cy=\"12\" r=\"10\" stroke-width=\"2\" />\n      <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" stroke-width=\"2\" />\n      <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" stroke-width=\"2\" />\n    </svg>\n    <p class=\"error-message\">{{ errorMessage }}</p>\n  </div>\n\n  <!-- Payment Form -->\n  <div *ngIf=\"!loading && !loadingSavedMethods && !errorMessage\" class=\"payment-form\">\n\n    <!-- Saved Payment Methods -->\n    <div *ngIf=\"savedPaymentMethods.length > 0\" class=\"saved-methods\">\n      <p class=\"section-title\">Saved Payment Methods</p>\n\n      <div class=\"saved-cards-list\">\n        <div *ngFor=\"let method of savedPaymentMethods\" class=\"saved-card-item\"\n          [class.selected]=\"selectedPaymentMethodId === method.id\" (click)=\"selectPaymentMethod(method.id)\">\n          <div class=\"card-radio\">\n            <input type=\"radio\" [name]=\"'payment-method-' + customerId\" [id]=\"method.id\" [value]=\"method.id\"\n              [checked]=\"selectedPaymentMethodId === method.id\" (change)=\"selectPaymentMethod(method.id)\">\n          </div>\n          <div class=\"card-icon\">\n            <span class=\"brand-badge\">{{ getCardBrandIcon(method.cardBrand) }}</span>\n          </div>\n          <div class=\"card-info\">\n            <span class=\"card-number\">•••• {{ method.cardLast4 }}</span>\n            <span class=\"card-expiry\">Expires {{ method.cardExpMonth }}/{{ method.cardExpYear }}</span>\n          </div>\n          <div *ngIf=\"method.isDefault\" class=\"default-badge\">Default</div>\n        </div>\n\n        <!-- Add New Card Option -->\n        <div class=\"saved-card-item add-new\" [class.selected]=\"showNewCardForm\"\n          (click)=\"selectPaymentMethod(undefined)\">\n          <div class=\"card-radio\">\n            <input type=\"radio\" [name]=\"'payment-method-' + customerId\" id=\"add-new-card\" [value]=\"'new'\"\n              [checked]=\"showNewCardForm\" (change)=\"selectPaymentMethod(undefined)\">\n          </div>\n          <div class=\"add-icon\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n              <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n            </svg>\n          </div>\n          <span class=\"add-text\">Add new card</span>\n        </div>\n      </div>\n\n      <!-- Use Selected Card Button -->\n      <button *ngIf=\"selectedPaymentMethodId && !showNewCardForm\" class=\"submit-button\"\n        [class.processing]=\"isProcessing\" [disabled]=\"isProcessing\" (click)=\"useSavedPaymentMethod()\">\n        <span>Continue with Selected Card</span>\n      </button>\n    </div>\n\n    <!-- New Card Form (shown when adding new or no saved cards) -->\n    <div *ngIf=\"showNewCardForm || savedPaymentMethods.length === 0\" class=\"new-card-form\">\n      <!-- Provider Info -->\n      <div class=\"provider-info\" *ngIf=\"savedPaymentMethods.length === 0\">\n        <div class=\"provider-badge\">\n          <svg *ngIf=\"isStripe\" class=\"provider-logo\" viewBox=\"0 0 28 12\">\n            <!-- Stripe logo -->\n            <path fill=\"currentColor\"\n              d=\"M13.976 1.872c-1.072 0-1.752.512-1.752 1.296 0 .64.48.928 1.36 1.136l.448.096c.64.144.928.352.928.672 0 .448-.432.704-1.136.704-.752 0-1.344-.288-1.648-.544l-.304.576c.368.304 1.024.592 1.952.592 1.2 0 1.952-.576 1.952-1.36 0-.672-.528-1.008-1.456-1.232l-.448-.096c-.576-.128-.896-.304-.896-.64 0-.4.384-.672.992-.672.672 0 1.136.256 1.408.464l.288-.592c-.336-.256-.896-.528-1.688-.528zm-5.904.048v4.848h.8V1.92h-.8zm-2.4 0l-1.456 3.616L2.808 1.92h-.88l2.016 4.864h.768l2-4.864h-.88zm15.2 0v4.848h.8v-1.84h1.776v-.72h-1.776V2.64h2.128v-.72h-2.928zm-5.04 0v4.848h2.928v-.72h-2.128v-1.44h1.776v-.72h-1.776v-1.248h2.128v-.72h-2.928z\" />\n          </svg>\n          <span *ngIf=\"isPaymob\" class=\"provider-logo-text\">Paymob</span>\n          <span class=\"provider-name\">{{ providerName }}</span>\n        </div>\n        <p class=\"provider-description\">Secure payment processing</p>\n      </div>\n\n      <!-- Stripe Card Element -->\n      <div *ngIf=\"isStripe\" class=\"stripe-container\">\n        <label for=\"stripe-card-element\" class=\"card-label\">Card Information</label>\n        <div id=\"stripe-card-element\" class=\"card-element\"></div>\n        <p class=\"security-note\">\n          <svg class=\"lock-icon\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n            <path\n              d=\"M8 1a3 3 0 0 0-3 3v2H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1h-2V4a3 3 0 0 0-3-3zm0 1a2 2 0 0 1 2 2v2H6V4a2 2 0 0 1 2-2z\" />\n          </svg>\n          Your card will be saved for future payments\n        </p>\n      </div>\n\n      <!-- Paymob Iframe -->\n      <div *ngIf=\"isPaymob && paymobIframeUrl\" class=\"paymob-container\">\n        <iframe [src]=\"paymobIframeUrl\" class=\"paymob-iframe\" frameborder=\"0\" allowpaymentrequest>\n        </iframe>\n      </div>\n\n      <!-- Paymob Pixel Card Element -->\n      <div *ngIf=\"isPaymob && paymobClientSecret && !paymobIframeUrl\" class=\"paymob-container\">\n        <label for=\"paymob-card-element\" class=\"card-label\">Card Information</label>\n        <div id=\"paymob-card-element\" class=\"card-element\"></div>\n        <p class=\"security-note\">\n          <svg class=\"lock-icon\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n            <path\n              d=\"M8 1a3 3 0 0 0-3 3v2H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1h-2V4a3 3 0 0 0-3-3zm0 1a2 2 0 0 1 2 2v2H6V4a2 2 0 0 1 2-2z\" />\n          </svg>\n          Your card will be saved for future payments\n        </p>\n      </div>\n\n      <!-- Paymob Placeholder (if URL not ready) -->\n      <div *ngIf=\"isPaymob && !paymobIframeUrl && !paymobClientSecret\" class=\"paymob-placeholder\">\n        <p>Initializing Paymob payment form...</p>\n        <p class=\"text-sm\">This requires backend support for payment intent creation.</p>\n      </div>\n\n      <!-- Submit Button (Stripe only - Paymob Pixel has built-in submit button) -->\n      <button *ngIf=\"isStripe\" class=\"submit-button\" [class.processing]=\"isProcessing\" [disabled]=\"isProcessing\"\n        (click)=\"submitPayment()\">\n        <span *ngIf=\"!isProcessing\">Add Payment Method</span>\n        <span *ngIf=\"isProcessing\" class=\"processing-text\">\n          <span class=\"spinner-small\"></span>\n          Adding card...\n        </span>\n      </button>\n    </div>\n  </div>\n\n  <!-- Supported Payment Methods -->\n  <div *ngIf=\"!loading && !errorMessage\" class=\"supported-methods\">\n    <p class=\"supported-title\">Supported payment methods</p>\n    <div class=\"payment-icons\">\n      <svg class=\"payment-icon\" viewBox=\"0 0 32 20\" fill=\"none\">\n        <!-- Visa -->\n        <rect width=\"32\" height=\"20\" rx=\"2\" fill=\"#1434CB\" />\n        <text x=\"16\" y=\"14\" fill=\"white\" font-size=\"10\" font-weight=\"bold\" text-anchor=\"middle\">VISA</text>\n      </svg>\n      <svg class=\"payment-icon\" viewBox=\"0 0 32 20\" fill=\"none\">\n        <!-- Mastercard -->\n        <rect width=\"32\" height=\"20\" rx=\"2\" fill=\"#EB001B\" />\n        <circle cx=\"12\" cy=\"10\" r=\"6\" fill=\"#FF5F00\" />\n        <circle cx=\"20\" cy=\"10\" r=\"6\" fill=\"#F79E1B\" />\n      </svg>\n      <svg class=\"payment-icon\" viewBox=\"0 0 32 20\" fill=\"none\">\n        <!-- Amex -->\n        <rect width=\"32\" height=\"20\" rx=\"2\" fill=\"#006FCF\" />\n        <text x=\"16\" y=\"14\" fill=\"white\" font-size=\"8\" font-weight=\"bold\" text-anchor=\"middle\">AMEX</text>\n      </svg>\n    </div>\n  </div>\n</div>","import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject, interval, takeUntil } from 'rxjs';\nimport { PaymentLinksService } from '../../services/payment-links.service';\nimport {\n  PaymentMode,\n  PaymentLinkSummary,\n  PaymentUrlReadyEvent,\n  PaymentCompletedEvent\n} from '../../models';\n\n/**\n * Payment Link Alert Component\n *\n * Displays a ribbon alert when customer has unpaid payment links.\n * Supports three payment modes: new-window, redirect, iframe.\n *\n * @example\n * ```html\n * <subtrak-payment-link-alert\n *   [customerId]=\"currentCustomerId\"\n *   [paymentMode]=\"'new-window'\"\n *   [autoRefreshAfterPayment]=\"true\"\n *   (paymentLinkClicked)=\"handlePayment($event)\">\n * </subtrak-payment-link-alert>\n * ```\n */\n@Component({\n  selector: 'subtrak-payment-link-alert',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './payment-link-alert.component.html',\n  styleUrls: ['./payment-link-alert.component.scss']\n})\nexport class PaymentLinkAlertComponent implements OnInit, OnDestroy {\n  private destroy$ = new Subject<void>();\n\n  // Inputs\n  @Input() customerId!: string;\n  @Input() autoCheck: boolean = true;\n  @Input() refreshInterval?: number;\n  @Input() paymentMode: PaymentMode = 'new-window';\n  @Input() autoRefreshAfterPayment: boolean = true;\n  @Input() dismissable: boolean = true;\n  @Input() showOneTimeLinks: boolean = true;\n\n  // Outputs\n  @Output() paymentLinkClicked = new EventEmitter<string>();\n  @Output() paymentUrlReady = new EventEmitter<PaymentUrlReadyEvent>();\n  @Output() dismissed = new EventEmitter<void>();\n  @Output() linksLoaded = new EventEmitter<PaymentLinkSummary>();\n  @Output() paymentCompleted = new EventEmitter<PaymentCompletedEvent>();\n\n  // State\n  summary: PaymentLinkSummary | null = null;\n  loading = false;\n  error: string | null = null;\n  isDismissed = false;\n  showSuccessMessage = false;\n\n  constructor(private paymentLinksService: PaymentLinksService) {}\n\n  ngOnInit(): void {\n    // Check if component was dismissed before\n    const dismissedKey = `subtrak-payment-alert-dismissed-${this.customerId}`;\n    const dismissedUntil = localStorage.getItem(dismissedKey);\n    if (dismissedUntil) {\n      const dismissedDate = new Date(dismissedUntil);\n      if (dismissedDate > new Date()) {\n        this.isDismissed = true;\n        return;\n      }\n    }\n\n    // Check for payment completion redirect\n    this.checkPaymentCompletion();\n\n    // Initial check if autoCheck is enabled\n    if (this.autoCheck && this.customerId) {\n      this.checkPendingPaymentLinks();\n    }\n\n    // Set up polling if refreshInterval is provided\n    if (this.refreshInterval && this.refreshInterval > 0) {\n      interval(this.refreshInterval)\n        .pipe(takeUntil(this.destroy$))\n        .subscribe(() => {\n          this.checkPendingPaymentLinks();\n        });\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  /**\n   * Check URL parameters for payment completion redirect\n   */\n  private checkPaymentCompletion(): void {\n    const urlParams = new URLSearchParams(window.location.search);\n    const paymentSuccess = urlParams.get('payment_success');\n    const token = urlParams.get('payment_link_token');\n    const subscriptionId = urlParams.get('subscription_id');\n\n    if (paymentSuccess === 'true' && token) {\n      if (this.autoRefreshAfterPayment) {\n        // Show success message\n        this.showSuccessMessage = true;\n\n        // Reload page after 2 seconds\n        setTimeout(() => {\n          window.location.reload();\n        }, 2000);\n      } else {\n        // Emit event for parent to handle\n        this.paymentCompleted.emit({\n          token,\n          success: true,\n          subscriptionId: subscriptionId || undefined\n        });\n\n        // Clean URL without reloading\n        const cleanUrl = window.location.pathname;\n        window.history.replaceState({}, '', cleanUrl);\n\n        // Refresh data\n        this.checkPendingPaymentLinks();\n      }\n    }\n  }\n\n  /**\n   * Fetch pending payment links for the customer\n   */\n  checkPendingPaymentLinks(): void {\n    if (!this.customerId) {\n      console.warn('[PaymentLinkAlertComponent] No customerId provided');\n      return;\n    }\n\n    this.loading = true;\n    this.error = null;\n\n    this.paymentLinksService.getAllPendingPaymentLinks(this.customerId)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (summary) => {\n          this.summary = summary;\n          this.loading = false;\n          this.linksLoaded.emit(summary);\n        },\n        error: (err) => {\n          this.error = 'Unable to load payment information';\n          this.loading = false;\n          console.error('[PaymentLinkAlertComponent] Error loading payment links:', err);\n        }\n      });\n  }\n\n  /**\n   * Handle \"Pay Now\" button click\n   */\n  handlePayNow(): void {\n    if (!this.summary || this.summary.links.length === 0) {\n      return;\n    }\n\n    // Get the first payment link\n    const link = this.summary.links[0];\n    const token = link.token;\n\n    // Use absolute payment URL from backend if available, otherwise construct relative URL\n    // Note: API returns payment_url (snake_case) but interceptor transforms it to paymentUrl (camelCase)\n    const paymentUrl = (link as any).paymentUrl || (link as any).payment_url || `/pay/${token}`;\n\n    // Emit event\n    this.paymentLinkClicked.emit(paymentUrl);\n\n    // Handle based on payment mode\n    switch (this.paymentMode) {\n      case 'new-window':\n        window.open(paymentUrl, '_blank');\n        break;\n\n      case 'redirect':\n        window.location.href = paymentUrl;\n        break;\n\n      case 'iframe':\n        // Emit event for parent to handle iframe rendering\n        const amount = parseFloat(\n          'amount' in link\n            ? link.amount\n            : ((link as any).invoice?.total || '0')\n        );\n        const currency = 'currency' in link\n          ? link.currency\n          : ((link as any).invoice?.currency || 'USD');\n\n        this.paymentUrlReady.emit({\n          paymentUrl,\n          iframeId: link.id,\n          subscriptionId: 'subscription_id' in link ? (link as any).subscription_id : undefined,\n          amount,\n          currency\n        });\n        break;\n    }\n  }\n\n  /**\n   * Handle dismiss button click\n   */\n  handleDismiss(): void {\n    // Store dismissal in localStorage for 24 hours\n    const dismissedKey = `subtrak-payment-alert-dismissed-${this.customerId}`;\n    const dismissUntil = new Date();\n    dismissUntil.setHours(dismissUntil.getHours() + 24);\n    localStorage.setItem(dismissedKey, dismissUntil.toISOString());\n\n    this.isDismissed = true;\n    this.dismissed.emit();\n  }\n\n  /**\n   * Get display-friendly count message\n   */\n  get countMessage(): string {\n    if (!this.summary) return '';\n    const count = this.summary.count;\n    return count === 1 ? '1 unpaid invoice' : `${count} unpaid invoices`;\n  }\n\n  /**\n   * Get formatted amount\n   */\n  get formattedAmount(): string {\n    if (!this.summary) return '';\n    return `${this.summary.totalAmount.toFixed(2)} ${this.summary.currency}`;\n  }\n\n  /**\n   * Check if component should be visible\n   */\n  get isVisible(): boolean {\n    return !this.isDismissed &&\n           !this.showSuccessMessage &&\n           this.summary !== null &&\n           this.summary.count > 0;\n  }\n}\n","<!-- Success Message (after payment completion) -->\n<div *ngIf=\"showSuccessMessage\" class=\"payment-alert-ribbon payment-alert-success\">\n  <div class=\"payment-alert-ribbon__icon\">\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n      <path d=\"M20 6L9 17l-5-5\"></path>\n    </svg>\n  </div>\n  <div class=\"payment-alert-ribbon__content\">\n    <div class=\"payment-alert-ribbon__content-title\">Payment Successful!</div>\n    <div class=\"payment-alert-ribbon__content-message\">Your payment has been processed. Refreshing...</div>\n  </div>\n</div>\n\n<!-- Loading State -->\n<div *ngIf=\"loading && !showSuccessMessage\" class=\"payment-alert-ribbon\">\n  <div class=\"payment-alert-ribbon__icon\">\n    <svg class=\"payment-alert-spinner\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n      <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" fill=\"none\" opacity=\"0.25\"></circle>\n      <path d=\"M4 12a8 8 0 018-8\" stroke=\"currentColor\" stroke-width=\"4\" fill=\"none\" stroke-linecap=\"round\"></path>\n    </svg>\n  </div>\n  <div class=\"payment-alert-ribbon__content\">\n    <div class=\"payment-alert-ribbon__content-message\">Checking for pending payments...</div>\n  </div>\n</div>\n\n<!-- Error State -->\n<div *ngIf=\"error && !showSuccessMessage\" class=\"payment-alert-ribbon payment-alert-error\">\n  <div class=\"payment-alert-ribbon__icon\">\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n      <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n      <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n      <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n    </svg>\n  </div>\n  <div class=\"payment-alert-ribbon__content\">\n    <div class=\"payment-alert-ribbon__content-message\">{{ error }}</div>\n  </div>\n  <div class=\"payment-alert-ribbon__actions\">\n    <button type=\"button\" class=\"payment-alert-button payment-alert-button--retry\" (click)=\"checkPendingPaymentLinks()\">\n      Retry\n    </button>\n  </div>\n</div>\n\n<!-- Payment Alert (has unpaid invoices) -->\n<div *ngIf=\"isVisible\" class=\"payment-alert-ribbon\">\n  <div class=\"payment-alert-ribbon__icon\">\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n      <path d=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\"></path>\n      <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n      <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n    </svg>\n  </div>\n\n  <div class=\"payment-alert-ribbon__content\">\n    <div class=\"payment-alert-ribbon__content-title\">Payment Required</div>\n    <div class=\"payment-alert-ribbon__content-message\">\n      You have {{ countMessage }} totaling {{ formattedAmount }}\n    </div>\n  </div>\n\n  <div class=\"payment-alert-ribbon__actions\">\n    <button type=\"button\" class=\"payment-alert-button payment-alert-button--primary\" (click)=\"handlePayNow()\">\n      Pay Now\n    </button>\n    <button\n      *ngIf=\"dismissable\"\n      type=\"button\"\n      class=\"payment-alert-button payment-alert-button--close\"\n      (click)=\"handleDismiss()\"\n      aria-label=\"Dismiss alert\">\n      ×\n    </button>\n  </div>\n</div>\n","/**\n * Subtrak Angular SDK - Pre-built UI Components\n *\n * Ready-to-use components for subscription billing management\n */\n\nexport { PricingTableComponent } from './pricing-table/pricing-table.component';\nexport { SubscriptionStatusComponent } from './subscription-status/subscription-status.component';\nexport { UsageMeterComponent } from './usage-meter/usage-meter.component';\nexport { EntitlementDisplayComponent } from './entitlement-display/entitlement-display.component';\nexport { BillingPortalComponent } from './billing-portal/billing-portal.component';\nexport { PaymentProviderCardComponent } from './payment-provider-card/payment-provider-card.component';\nexport { PaymentLinkAlertComponent } from './payment-link-alert/payment-link-alert.component';\n","import { Directive, Input, OnInit, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { EntitlementsService } from '../services/entitlements.service';\nimport { SubtrakService } from '../services/subtrak.service';\n\n/**\n * Structural directive for gating content based on BOOLEAN entitlements\n *\n * This directive shows or hides content based on whether the customer has access\n * to a specific feature. It automatically handles subscription to entitlement changes.\n *\n * @example\n * ```html\n * <!-- Simple usage - show content if customer has feature -->\n * <div *subFeatureGate=\"'premium_analytics'\">\n *   Premium Analytics Dashboard\n * </div>\n *\n * <!-- With else template -->\n * <div *subFeatureGate=\"'export_data'; else: noAccess\">\n *   <button (click)=\"exportData()\">Export Data</button>\n * </div>\n * <ng-template #noAccess>\n *   <button (click)=\"showUpgradeModal()\">Upgrade to Export</button>\n * </ng-template>\n *\n * <!-- With explicit customer ID -->\n * <div *subFeatureGate=\"'premium_analytics'; customerId: 'cus_123'\">\n *   Content\n * </div>\n * ```\n */\n@Directive({\n  selector: '[subFeatureGate]',\n  standalone: true\n})\nexport class FeatureGateDirective implements OnInit, OnDestroy {\n  private destroy$ = new Subject<void>();\n  private hasView = false;\n\n  /**\n   * The feature code to check access for\n   */\n  @Input() subFeatureGate!: string;\n\n  /**\n   * Optional else template to show when access is denied\n   */\n  @Input() subFeatureGateElse?: TemplateRef<any>;\n\n  /**\n   * Optional customer ID (defaults to SDK configured customer ID)\n   */\n  @Input() subFeatureGateCustomerId?: string;\n\n  constructor(\n    private templateRef: TemplateRef<any>,\n    private viewContainer: ViewContainerRef,\n    private entitlementsService: EntitlementsService,\n    private subtrakService: SubtrakService\n  ) {}\n\n  ngOnInit(): void {\n    if (!this.subFeatureGate) {\n      console.error('[FeatureGateDirective] Feature code is required');\n      return;\n    }\n\n    const customerId = this.subFeatureGateCustomerId || this.subtrakService.getCustomerId();\n\n    if (!customerId) {\n      console.error('[FeatureGateDirective] Customer ID is required. Set it via SDK config or directive input.');\n      this.showElseTemplate();\n      return;\n    }\n\n    // Check feature access\n    this.entitlementsService\n      .hasFeature(customerId, this.subFeatureGate)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (hasAccess) => {\n          this.updateView(hasAccess);\n        },\n        error: (error) => {\n          console.error('[FeatureGateDirective] Error checking feature access:', error);\n          this.showElseTemplate();\n        }\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private updateView(hasAccess: boolean): void {\n    this.viewContainer.clear();\n    this.hasView = false;\n\n    if (hasAccess) {\n      this.viewContainer.createEmbeddedView(this.templateRef);\n      this.hasView = true;\n    } else {\n      this.showElseTemplate();\n    }\n  }\n\n  private showElseTemplate(): void {\n    if (this.subFeatureGateElse && !this.hasView) {\n      this.viewContainer.createEmbeddedView(this.subFeatureGateElse);\n    }\n  }\n}\n","import { Directive, Input, OnInit, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { EntitlementsService } from '../services/entitlements.service';\nimport { SubtrakService } from '../services/subtrak.service';\n\n/**\n * Structural directive for gating content based on NUMERIC entitlement quotas\n *\n * This directive shows or hides content based on whether the current usage is\n * within the customer's quota limit. It's useful for enforcing usage limits\n * on actions like creating projects, uploading files, etc.\n *\n * @example\n * ```html\n * <!-- Simple usage - show if within limit -->\n * <button *subQuotaGuard=\"'max_projects'; current: projectCount\"\n *         (click)=\"createProject()\">\n *   Create New Project\n * </button>\n *\n * <!-- With else template -->\n * <button *subQuotaGuard=\"'max_projects'; current: projectCount; else: limitReached\"\n *         (click)=\"createProject()\">\n *   Create Project\n * </button>\n * <ng-template #limitReached>\n *   <div class=\"warning\">\n *     <p>Project limit reached ({{ projectCount }}/{{ limit }})</p>\n *     <button (click)=\"showUpgradeModal()\">Upgrade Plan</button>\n *   </div>\n * </ng-template>\n *\n * <!-- With explicit customer ID -->\n * <button *subQuotaGuard=\"'max_storage_gb'; current: usedStorage; customerId: 'cus_123'\"\n *         (click)=\"uploadFile()\">\n *   Upload File\n * </button>\n * ```\n */\n@Directive({\n  selector: '[subQuotaGuard]',\n  standalone: true\n})\nexport class QuotaGuardDirective implements OnInit, OnDestroy {\n  private destroy$ = new Subject<void>();\n  private hasView = false;\n\n  /**\n   * The quota entitlement code to check\n   */\n  @Input() subQuotaGuard!: string;\n\n  /**\n   * Current usage value to compare against the limit\n   */\n  @Input() subQuotaGuardCurrent!: number;\n\n  /**\n   * Optional else template to show when quota is exceeded\n   */\n  @Input() subQuotaGuardElse?: TemplateRef<any>;\n\n  /**\n   * Optional customer ID (defaults to SDK configured customer ID)\n   */\n  @Input() subQuotaGuardCustomerId?: string;\n\n  constructor(\n    private templateRef: TemplateRef<any>,\n    private viewContainer: ViewContainerRef,\n    private entitlementsService: EntitlementsService,\n    private subtrakService: SubtrakService\n  ) {}\n\n  ngOnInit(): void {\n    if (!this.subQuotaGuard) {\n      console.error('[QuotaGuardDirective] Quota code is required');\n      return;\n    }\n\n    if (this.subQuotaGuardCurrent === undefined || this.subQuotaGuardCurrent === null) {\n      console.error('[QuotaGuardDirective] Current usage value is required');\n      this.showElseTemplate();\n      return;\n    }\n\n    const customerId = this.subQuotaGuardCustomerId || this.subtrakService.getCustomerId();\n\n    if (!customerId) {\n      console.error('[QuotaGuardDirective] Customer ID is required. Set it via SDK config or directive input.');\n      this.showElseTemplate();\n      return;\n    }\n\n    // Check if within quota\n    this.entitlementsService\n      .isWithinLimit(customerId, this.subQuotaGuard, this.subQuotaGuardCurrent)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (withinLimit) => {\n          this.updateView(withinLimit);\n        },\n        error: (error) => {\n          console.error('[QuotaGuardDirective] Error checking quota:', error);\n          this.showElseTemplate();\n        }\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private updateView(withinLimit: boolean): void {\n    this.viewContainer.clear();\n    this.hasView = false;\n\n    if (withinLimit) {\n      this.viewContainer.createEmbeddedView(this.templateRef);\n      this.hasView = true;\n    } else {\n      this.showElseTemplate();\n    }\n  }\n\n  private showElseTemplate(): void {\n    if (this.subQuotaGuardElse && !this.hasView) {\n      this.viewContainer.createEmbeddedView(this.subQuotaGuardElse);\n    }\n  }\n}\n","/**\n * Subtrak Angular SDK Directives\n */\n\nexport { FeatureGateDirective } from './feature-gate.directive';\nexport { QuotaGuardDirective } from './quota-guard.directive';\n","import { inject } from '@angular/core';\nimport { Router, CanActivateFn, ActivatedRouteSnapshot } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { EntitlementsService } from '../services/entitlements.service';\nimport { SubtrakService } from '../services/subtrak.service';\n\n/**\n * Route guard for protecting routes based on entitlements\n *\n * This guard checks if a customer has access to a specific entitlement before\n * allowing navigation to a route. Supports all entitlement types.\n *\n * @example\n * ```typescript\n * // In routes configuration\n * import { Routes } from '@angular/router';\n * import { entitlementGuard } from '@subtrak/angular';\n *\n * export const routes: Routes = [\n *   // BOOLEAN entitlement (feature flag)\n *   {\n *     path: 'analytics',\n *     component: AnalyticsComponent,\n *     canActivate: [entitlementGuard],\n *     data: {\n *       entitlement: 'premium_analytics',\n *       type: 'BOOLEAN',\n *       redirectTo: '/upgrade'\n *     }\n *   },\n *\n *   // NUMERIC entitlement (quota check)\n *   {\n *     path: 'projects/create',\n *     component: CreateProjectComponent,\n *     canActivate: [entitlementGuard],\n *     data: {\n *       entitlement: 'max_projects',\n *       type: 'NUMERIC',\n *       checkLimit: true,\n *       getCurrentValue: () => inject(ProjectService).getCount(),\n *       redirectTo: '/upgrade'\n *     }\n *   },\n *\n *   // ENUM entitlement (value check)\n *   {\n *     path: 'priority-support',\n *     component: PrioritySupportComponent,\n *     canActivate: [entitlementGuard],\n *     data: {\n *       entitlement: 'support_level',\n *       type: 'ENUM',\n *       requiredValue: 'priority',\n *       redirectTo: '/upgrade'\n *     }\n *   }\n * ];\n * ```\n */\nexport const entitlementGuard: CanActivateFn = (\n  route: ActivatedRouteSnapshot\n): Observable<boolean> => {\n  const entitlementsService = inject(EntitlementsService);\n  const subtrakService = inject(SubtrakService);\n  const router = inject(Router);\n\n  // Get configuration from route data\n  const {\n    entitlement,\n    type = 'BOOLEAN',\n    checkLimit = false,\n    getCurrentValue,\n    requiredValue,\n    redirectTo = '/unauthorized',\n    customerId: routeCustomerId\n  } = route.data;\n\n  // Validate required configuration\n  if (!entitlement) {\n    console.error('[EntitlementGuard] Missing required \"entitlement\" in route data');\n    router.navigate([redirectTo]);\n    return of(false);\n  }\n\n  // Get customer ID\n  const customerId = routeCustomerId || subtrakService.getCustomerId();\n\n  if (!customerId) {\n    console.error('[EntitlementGuard] Customer ID is required. Set it via SDK config or route data.');\n    router.navigate(['/login']);\n    return of(false);\n  }\n\n  // Handle different entitlement types\n  switch (type) {\n    case 'BOOLEAN':\n      return checkBooleanEntitlement(\n        entitlementsService,\n        router,\n        customerId,\n        entitlement,\n        redirectTo\n      );\n\n    case 'NUMERIC':\n      if (checkLimit && getCurrentValue) {\n        const currentValue = getCurrentValue();\n        return checkNumericEntitlement(\n          entitlementsService,\n          router,\n          customerId,\n          entitlement,\n          currentValue,\n          redirectTo\n        );\n      } else {\n        // Just check if entitlement exists\n        return checkBooleanEntitlement(\n          entitlementsService,\n          router,\n          customerId,\n          entitlement,\n          redirectTo\n        );\n      }\n\n    case 'ENUM':\n      if (requiredValue !== undefined) {\n        return checkEnumEntitlement(\n          entitlementsService,\n          router,\n          customerId,\n          entitlement,\n          requiredValue,\n          redirectTo\n        );\n      } else {\n        console.error('[EntitlementGuard] ENUM type requires \"requiredValue\" in route data');\n        router.navigate([redirectTo]);\n        return of(false);\n      }\n\n    case 'METERED':\n      // For metered entitlements, just check if it exists\n      return checkBooleanEntitlement(\n        entitlementsService,\n        router,\n        customerId,\n        entitlement,\n        redirectTo\n      );\n\n    default:\n      console.error(`[EntitlementGuard] Unknown entitlement type: ${type}`);\n      router.navigate([redirectTo]);\n      return of(false);\n  }\n};\n\n/**\n * Check BOOLEAN entitlement\n */\nfunction checkBooleanEntitlement(\n  service: EntitlementsService,\n  router: Router,\n  customerId: string,\n  code: string,\n  redirectTo: string\n): Observable<boolean> {\n  return service.hasFeature(customerId, code).pipe(\n    map(hasAccess => {\n      if (!hasAccess) {\n        router.navigate([redirectTo]);\n      }\n      return hasAccess;\n    }),\n    catchError(error => {\n      console.error('[EntitlementGuard] Error checking entitlement:', error);\n      router.navigate([redirectTo]);\n      return of(false);\n    })\n  );\n}\n\n/**\n * Check NUMERIC entitlement with limit\n */\nfunction checkNumericEntitlement(\n  service: EntitlementsService,\n  router: Router,\n  customerId: string,\n  code: string,\n  currentValue: number,\n  redirectTo: string\n): Observable<boolean> {\n  return service.isWithinLimit(customerId, code, currentValue).pipe(\n    map(withinLimit => {\n      if (!withinLimit) {\n        router.navigate([redirectTo]);\n      }\n      return withinLimit;\n    }),\n    catchError(error => {\n      console.error('[EntitlementGuard] Error checking quota:', error);\n      router.navigate([redirectTo]);\n      return of(false);\n    })\n  );\n}\n\n/**\n * Check ENUM entitlement value\n */\nfunction checkEnumEntitlement(\n  service: EntitlementsService,\n  router: Router,\n  customerId: string,\n  code: string,\n  requiredValue: string,\n  redirectTo: string\n): Observable<boolean> {\n  return service.getEnumValue(customerId, code).pipe(\n    map(value => {\n      const hasAccess = value === requiredValue;\n      if (!hasAccess) {\n        router.navigate([redirectTo]);\n      }\n      return hasAccess;\n    }),\n    catchError(error => {\n      console.error('[EntitlementGuard] Error checking enum value:', error);\n      router.navigate([redirectTo]);\n      return of(false);\n    })\n  );\n}\n","/**\n * Subtrak Angular SDK Guards\n */\n\nexport { entitlementGuard } from './entitlement.guard';\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { EntitlementValue, EntitlementType } from '../models';\nimport { EntitlementChecker } from '../utils/entitlement-checker';\n\n/**\n * Pipe for formatting entitlement values for display\n *\n * This pipe takes an entitlement (or entitlement code) and formats its value\n * in a human-readable way based on its type.\n *\n * @example\n * ```html\n * <!-- BOOLEAN entitlements -->\n * <span>{{ 'premium_analytics' | entitlementValue: entitlements }}</span>\n * <!-- Output: \"Enabled\" or \"Disabled\" -->\n *\n * <!-- NUMERIC entitlements -->\n * <span>{{ 'max_api_calls' | entitlementValue: entitlements }}</span>\n * <!-- Output: \"10,000 API calls\" -->\n *\n * <!-- ENUM entitlements -->\n * <span>{{ 'support_level' | entitlementValue: entitlements }}</span>\n * <!-- Output: \"Priority Support\" or whatever the enum value is -->\n *\n * <!-- Direct entitlement object -->\n * <span>{{ entitlement | entitlementValue }}</span>\n *\n * <!-- With custom format for unlimited -->\n * <span>{{ 'max_projects' | entitlementValue: entitlements: 'Unlimited' }}</span>\n * ```\n */\n@Pipe({\n  name: 'entitlementValue',\n  standalone: true\n})\nexport class EntitlementValuePipe implements PipeTransform {\n  /**\n   * Transform entitlement to display value\n   *\n   * @param value - Entitlement code (string) or EntitlementValue object\n   * @param entitlements - Array of all entitlements (required if value is a code string)\n   * @param unlimitedText - Custom text for unlimited values (default: 'Unlimited')\n   * @returns Formatted display string\n   */\n  transform(\n    value: string | EntitlementValue | null | undefined,\n    entitlements?: EntitlementValue[],\n    unlimitedText: string = 'Unlimited'\n  ): string {\n    if (!value) {\n      return 'N/A';\n    }\n\n    let entitlement: EntitlementValue;\n\n    // If value is a string, find it in entitlements array\n    if (typeof value === 'string') {\n      if (!entitlements || entitlements.length === 0) {\n        return 'N/A';\n      }\n\n      const found = entitlements.find(e => e.code === value);\n      if (!found) {\n        return 'N/A';\n      }\n\n      entitlement = found;\n    } else {\n      entitlement = value;\n    }\n\n    // Use EntitlementChecker for consistent formatting\n    const checker = new EntitlementChecker([entitlement]);\n    const displayValue = checker.getDisplayValue(entitlement.code);\n\n    if (!displayValue) {\n      return 'N/A';\n    }\n\n    // Replace \"Unlimited\" with custom text if provided\n    if (displayValue === 'Unlimited' && unlimitedText !== 'Unlimited') {\n      return unlimitedText;\n    }\n\n    return displayValue;\n  }\n}\n\n/**\n * Pipe for formatting entitlement progress (for NUMERIC types)\n *\n * @example\n * ```html\n * <!-- Show progress percentage -->\n * <span>{{ entitlement | entitlementProgress: currentUsage }}</span>\n * <!-- Output: \"80%\" -->\n *\n * <!-- Show as fraction -->\n * <span>{{ entitlement | entitlementProgress: currentUsage: 'fraction' }}</span>\n * <!-- Output: \"8,000 / 10,000\" -->\n * ```\n */\n@Pipe({\n  name: 'entitlementProgress',\n  standalone: true\n})\nexport class EntitlementProgressPipe implements PipeTransform {\n  transform(\n    entitlement: EntitlementValue | null | undefined,\n    currentUsage: number,\n    format: 'percentage' | 'fraction' = 'percentage'\n  ): string {\n    if (!entitlement || entitlement.type !== EntitlementType.NUMERIC) {\n      return 'N/A';\n    }\n\n    const limit = entitlement.value as number;\n\n    if (limit === -1) {\n      return 'Unlimited';\n    }\n\n    if (format === 'percentage') {\n      if (limit === 0) return '100%';\n      const percentage = Math.min(100, (currentUsage / limit) * 100);\n      return `${Math.round(percentage)}%`;\n    } else {\n      // fraction format\n      const unit = entitlement.unit ? ` ${entitlement.unit}` : '';\n      return `${currentUsage.toLocaleString()} / ${limit.toLocaleString()}${unit}`;\n    }\n  }\n}\n\n/**\n * Pipe for checking if entitlement value matches a condition\n *\n * Useful for *ngIf conditions in templates\n *\n * @example\n * ```html\n * <!-- Check if feature is enabled -->\n * <div *ngIf=\"'premium_analytics' | entitlementCheck: entitlements\">\n *   Premium content\n * </div>\n *\n * <!-- Check if enum matches value -->\n * <div *ngIf=\"'support_level' | entitlementCheck: entitlements: 'priority'\">\n *   Priority support content\n * </div>\n *\n * <!-- Check if within limit -->\n * <button [disabled]=\"!('max_projects' | entitlementCheck: entitlements: projectCount)\">\n *   Create Project\n * </button>\n * ```\n */\n@Pipe({\n  name: 'entitlementCheck',\n  standalone: true\n})\nexport class EntitlementCheckPipe implements PipeTransform {\n  transform(\n    code: string | null | undefined,\n    entitlements: EntitlementValue[] | null | undefined,\n    checkValue?: any\n  ): boolean {\n    if (!code || !entitlements || entitlements.length === 0) {\n      return false;\n    }\n\n    const checker = new EntitlementChecker(entitlements);\n    return checker.checkAccess(code, checkValue);\n  }\n}\n","/**\n * Subtrak Angular SDK Pipes\n */\n\nexport { EntitlementValuePipe, EntitlementProgressPipe, EntitlementCheckPipe } from './entitlement-value.pipe';\n","import { EnvironmentProviders, makeEnvironmentProviders, inject, Optional } from '@angular/core';\nimport { HttpBackend, HttpXhrBackend } from '@angular/common/http';\nimport { SUBTRAK_CONFIG, SubtrakConfig } from './lib/tokens/config.token';\nimport {\n    SubtrakService,\n    SubscriptionsService,\n    EntitlementsService,\n    UsageService,\n    PaymentMethodsService,\n    InvoicesService,\n    PaymentLinksService,\n    CustomersService\n} from './lib/services';\n\n/*\n * Public API Surface of @subtrak/angular\n */\n\n\n// ============================================================================\n// MODELS & TYPES\n// ============================================================================\nexport * from './lib/models';\n\n// ============================================================================\n// CONFIGURATION\n// ============================================================================\nexport * from './lib/tokens/config.token';\nexport { SUBTRAK_CONFIG, type SubtrakConfig, DEFAULT_SUBTRAK_CONFIG } from './lib/tokens/config.token';\n\n// ============================================================================\n// ERRORS\n// ============================================================================\nexport * from './lib/errors/subtrak-error';\nexport {\n    SubtrakError,\n    ApiError,\n    ValidationError,\n    AuthError,\n    PermissionError,\n    NotFoundError,\n    RateLimitError,\n    NetworkError,\n    TimeoutError,\n    ConfigError\n} from './lib/errors/subtrak-error';\n\n// ============================================================================\n// INTERCEPTORS\n// ============================================================================\nexport * from './lib/interceptors';\n\n// ============================================================================\n// SERVICES\n// ============================================================================\nexport * from './lib/services';\n\n// ============================================================================\n// COMPONENTS\n// ============================================================================\nexport * from './lib/components';\n\n// ============================================================================\n// DIRECTIVES\n// ============================================================================\nexport * from './lib/directives';\n\n// ============================================================================\n// GUARDS\n// ============================================================================\nexport * from './lib/guards';\n\n// ============================================================================\n// PIPES\n// ============================================================================\nexport * from './lib/pipes';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\nexport { EntitlementChecker } from './lib/utils/entitlement-checker';\nexport {\n    toSnakeCase,\n    toCamelCase,\n    transformKeysToSnakeCase,\n    transformKeysToCamelCase,\n    transformPaginationParams\n} from './lib/utils/case-transform';\n\n/**\n * Provide Subtrak SDK configuration and services\n */\nexport function provideSubtrak(config: SubtrakConfig): EnvironmentProviders {\n    return makeEnvironmentProviders([\n        // Config token\n        {\n            provide: SUBTRAK_CONFIG,\n            useValue: config\n        },\n        // Core service - using factory to ensure HttpBackend is available\n        {\n            provide: SubtrakService,\n            useFactory: (config: SubtrakConfig, httpBackend: HttpBackend) => {\n                return new SubtrakService(config, httpBackend);\n            },\n            deps: [SUBTRAK_CONFIG, HttpBackend]\n        },\n        // Resource services with factory functions\n        {\n            provide: SubscriptionsService,\n            useFactory: (subtrak: SubtrakService) => new SubscriptionsService(subtrak),\n            deps: [SubtrakService]\n        },\n        {\n            provide: EntitlementsService,\n            useFactory: (subtrak: SubtrakService) => new EntitlementsService(subtrak),\n            deps: [SubtrakService]\n        },\n        {\n            provide: UsageService,\n            useFactory: (subtrak: SubtrakService) => new UsageService(subtrak),\n            deps: [SubtrakService]\n        },\n        {\n            provide: PaymentMethodsService,\n            useFactory: (subtrak: SubtrakService) => new PaymentMethodsService(subtrak),\n            deps: [SubtrakService]\n        },\n        {\n            provide: InvoicesService,\n            useFactory: (subtrak: SubtrakService) => new InvoicesService(subtrak),\n            deps: [SubtrakService]\n        },\n        {\n            provide: PaymentLinksService,\n            useFactory: (subtrak: SubtrakService) => new PaymentLinksService(subtrak),\n            deps: [SubtrakService]\n        },\n        {\n            provide: CustomersService,\n            useFactory: (subtrak: SubtrakService) => new CustomersService(subtrak),\n            deps: [SubtrakService]\n        }\n    ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","catchError","i1.SubtrakService","toSnakeCase","retry","i1.SubscriptionsService","i2.SubtrakService","i3","i1.UsageService","i1.EntitlementsService","i1","i1.PaymentMethodsService","i1.InvoicesService","i4","i1.PaymentLinksService"],"mappings":"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"}