import { describe, expect, mock, test } from "bun:test";
import type Stripe from "stripe";

// The module is `server-only`; stub it so the pure helper can be imported here.
mock.module("server-only", () => ({}));
const { extractSubscriptionPeriod } = await import("./subscription-sync");

// Minimal Stripe.Subscription shape — only the fields the extractor reads.
function sub(partial: {
  status?: string;
  cancel?: boolean;
  itemEnd?: number;
  itemStart?: number;
  subEnd?: number;
  subStart?: number;
  interval?: string;
}): Stripe.Subscription {
  return {
    status: partial.status ?? "active",
    cancel_at_period_end: partial.cancel ?? false,
    current_period_start: partial.subStart,
    current_period_end: partial.subEnd,
    items: {
      data: [
        {
          current_period_start: partial.itemStart,
          current_period_end: partial.itemEnd,
          price: partial.interval
            ? { recurring: { interval: partial.interval } }
            : {},
        },
      ],
    },
  } as unknown as Stripe.Subscription;
}

describe("extractSubscriptionPeriod", () => {
  test("reads the renew date from the item (current API)", () => {
    const p = extractSubscriptionPeriod(
      sub({
        itemEnd: 1_750_000_000,
        itemStart: 1_747_000_000,
        interval: "month",
      }),
    );
    expect(p.periodEnd).toEqual(new Date(1_750_000_000 * 1000));
    expect(p.periodStart).toEqual(new Date(1_747_000_000 * 1000));
    expect(p.billingInterval).toBe("month");
  });

  test("falls back to the subscription-level period", () => {
    const p = extractSubscriptionPeriod(sub({ subEnd: 1_760_000_000 }));
    expect(p.periodEnd).toEqual(new Date(1_760_000_000 * 1000));
  });

  test("null period + default cancel flag when absent", () => {
    const p = extractSubscriptionPeriod(sub({}));
    expect(p.periodEnd).toBeNull();
    expect(p.periodStart).toBeNull();
    expect(p.cancelAtPeriodEnd).toBe(false);
  });

  test("carries status and cancel_at_period_end", () => {
    const p = extractSubscriptionPeriod(
      sub({ status: "past_due", cancel: true }),
    );
    expect(p.status).toBe("past_due");
    expect(p.cancelAtPeriodEnd).toBe(true);
  });
});
