/**
 * Offline smoke test for RevenueCat webhook mapping (no HTTP server).
 * npm run test:revenuecat-webhook-smoke
 */
import {
  mapEventTypeToSubscriptionStatus,
  selectActiveEntitlement,
} from "../services/revenuecatWebhookService";
import { normalizeRevenueCatProductId } from "../utils/revenuecatProductId";
import {
  hasFamilyAccess,
  hasPremiumAccess,
} from "../utils/subscriptionAccess";

function assert(cond: boolean, msg: string) {
  if (!cond) throw new Error(msg);
}

function run() {
  assert(
    mapEventTypeToSubscriptionStatus("INITIAL_PURCHASE", ["premium"]) === "active",
    "INITIAL_PURCHASE → active",
  );
  assert(
    mapEventTypeToSubscriptionStatus("RENEWAL", ["premium"]) === "active",
    "RENEWAL → active",
  );
  assert(
    mapEventTypeToSubscriptionStatus("EXPIRATION", []) === "expired",
    "EXPIRATION → expired",
  );
  assert(
    mapEventTypeToSubscriptionStatus("CANCELLATION", ["premium"]) === "cancelled",
    "CANCELLATION → cancelled",
  );
  assert(
    mapEventTypeToSubscriptionStatus("BILLING_ISSUE", ["premium"]) === "billing_issue",
    "BILLING_ISSUE → billing_issue",
  );

  assert(
    mapEventTypeToSubscriptionStatus("PRODUCT_CHANGE", ["premium"]) === "active",
    "PRODUCT_CHANGE → active",
  );
  assert(
    mapEventTypeToSubscriptionStatus("UNCANCELLATION", ["premium"]) === "active",
    "UNCANCELLATION → active",
  );
  assert(
    mapEventTypeToSubscriptionStatus("TRANSFER", ["premium"]) === "active",
    "TRANSFER with entitlement → active",
  );
  assert(
    mapEventTypeToSubscriptionStatus("TRANSFER", []) === "inactive",
    "TRANSFER without entitlement → inactive",
  );

  assert(selectActiveEntitlement(["premium", "family"]) === "family", "family wins");
  assert(selectActiveEntitlement(["premium"]) === "premium", "premium selected");
  assert(selectActiveEntitlement([]) === null, "no entitlement");

  assert(
    selectActiveEntitlement(["premium"]) === "premium",
    "PRODUCT_CHANGE downgrade: family→premium picks premium",
  );

  assert(
    normalizeRevenueCatProductId("premium_monthly:premium-monthly-base") ===
      "premium_monthly",
    "Google base plan normalize",
  );
  assert(normalizeRevenueCatProductId(null) === null, "null product id → null");
  assert(normalizeRevenueCatProductId("") === null, "empty product id → null");

  const activeUser = {
    subscriptionStatus: "active" as const,
    activeEntitlement: "premium" as const,
    subscriptionExpiresAt: new Date(Date.now() + 86400000),
  };
  assert(hasPremiumAccess(activeUser), "premium access");
  assert(!hasFamilyAccess(activeUser), "not family");

  const familyUser = {
    subscriptionStatus: "active" as const,
    activeEntitlement: "family" as const,
    subscriptionExpiresAt: new Date(Date.now() + 86400000),
  };
  assert(hasFamilyAccess(familyUser), "family access");
  assert(hasPremiumAccess(familyUser), "family includes premium gate");

  const expiredUser = {
    subscriptionStatus: "expired" as const,
    activeEntitlement: null as null,
    subscriptionExpiresAt: new Date(Date.now() - 86400000),
  };
  assert(!hasPremiumAccess(expiredUser), "expired user no premium");
  assert(!hasFamilyAccess(expiredUser), "expired user no family");

  const cancelledGraceUser = {
    subscriptionStatus: "cancelled" as const,
    activeEntitlement: "premium" as const,
    subscriptionExpiresAt: new Date(Date.now() + 86400000),
  };
  assert(hasPremiumAccess(cancelledGraceUser), "cancelled grace keeps premium");

  const billingIssueGraceUser = {
    subscriptionStatus: "billing_issue" as const,
    activeEntitlement: "family" as const,
    subscriptionExpiresAt: new Date(Date.now() + 86400000),
  };
  assert(hasFamilyAccess(billingIssueGraceUser), "billing_issue grace keeps family");

  console.log("revenuecatWebhookSmoke: OK (24 checks)");
}

try {
  run();
} catch (e) {
  console.error("revenuecatWebhookSmoke: FAILED", e);
  process.exit(1);
}
