/**
 * Billing Configuration
 *
 * This file centralizes all billing-related configuration.
 * Billing is feature-flagged and can be disabled for self-hosted instances.
 */

export const BILLING_CONFIG = {
  // Feature flag: Enable/disable billing system
  // Self-hosted instances can set this to false for unlimited usage
  enabled: process.env.ENABLE_BILLING === "true",

  // Stripe configuration (only used if billing is enabled)
  stripe: {
    secretKey: process.env.STRIPE_SECRET_KEY,
    publishableKey: process.env.STRIPE_PUBLISHABLE_KEY,
    webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,
    meterEventName: process.env.STRIPE_METER_EVENT_NAME || "echo_credits_used",
  },

  // Plan configurations
  plans: {
    free: {
      name: "Free",
      monthlyCredits: parseInt(process.env.FREE_PLAN_CREDITS || "200", 10),
      enableOverage: false,
      features: {
        episodesPerMonth: 200,
        searchesPerMonth: 200,
        mcpIntegrations: 3,
      },
    },
    pro: {
      name: "Pro",
      monthlyCredits: parseInt(process.env.PRO_PLAN_CREDITS || "2000", 10),
      enableOverage: true,
      overagePrice: parseFloat(process.env.PRO_OVERAGE_PRICE || "0.01"), // $0.01 per credit
      stripePriceId: process.env.PRO_PLAN_STRIPE_PRICE_ID,
      features: {
        episodesPerMonth: 2000,
        searchesPerMonth: 2000,
        mcpIntegrations: -1, // unlimited
        prioritySupport: true,
      },
    },
    max: {
      name: "Max",
      monthlyCredits: parseInt(process.env.MAX_PLAN_CREDITS || "10000", 10),
      enableOverage: true,
      overagePrice: parseFloat(process.env.MAX_OVERAGE_PRICE || "0.008"), // $0.008 per credit (cheaper than pro)
      stripePriceId: process.env.MAX_PLAN_STRIPE_PRICE_ID,
      features: {
        episodesPerMonth: 10000,
        searchesPerMonth: 10000,
        mcpIntegrations: -1, // unlimited
        prioritySupport: true,
        customIntegrations: true,
        dedicatedSupport: true,
      },
    },
  },

  // Credit costs per operation
  creditCosts: {
    addEpisode: parseInt(process.env.CREDIT_COST_EPISODE || "1", 10),
    search: parseInt(process.env.CREDIT_COST_SEARCH || "1", 10),
    chatMessage: parseInt(process.env.CREDIT_COST_CHAT || "1", 10),
  },

  // Billing cycle settings
  billingCycle: {
    // When to reset credits (1st of each month by default)
    resetDay: parseInt(process.env.BILLING_RESET_DAY || "1", 10),
  },
} as const;

/**
 * Get plan configuration by plan type
 */
export function getPlanConfig(planType: "FREE" | "PRO" | "MAX") {
  return BILLING_CONFIG.plans[
    planType.toLowerCase() as keyof typeof BILLING_CONFIG.plans
  ];
}

/**
 * Check if billing is enabled
 */
export function isBillingEnabled(): boolean {
  return BILLING_CONFIG.enabled;
}

/**
 * Check if Stripe is configured
 */
export function isStripeConfigured(): boolean {
  return !!(
    BILLING_CONFIG.stripe.secretKey && BILLING_CONFIG.stripe.publishableKey
  );
}

/**
 * Validate billing configuration
 */
export function validateBillingConfig() {
  if (!BILLING_CONFIG.enabled) {
    console.log(
      "ℹ️  Billing is disabled. Running in self-hosted mode with unlimited credits.",
    );
    return;
  }

  if (!isStripeConfigured()) {
    console.warn(
      "⚠️  ENABLE_BILLING is true but Stripe is not configured. Billing will not work.",
    );
  }

  console.log("✅ Billing is enabled with Stripe integration");
}
