import { describe, expect, it } from "vitest";
import {
  AcceptUploadRequestSchema, AcceptUploadResponseSchema, AdminActionResponseSchema,
  AdminCreditAdjustmentRequestSchema, AdminListRequestSchema, AdminListResponseSchema,
  AdminRetryRequestSchema, ApiErrorResponseSchema, BillingSummaryResponseSchema,
  ConversionResponseSchema, CreateCheckoutRequestSchema, CreateCheckoutResponseSchema,
  DownloadRequestSchema, DownloadResponseSchema, LibraryRequestSchema, LibraryResponseSchema,
  LoginRequestSchema, LogoutResponseSchema, RegisterRequestSchema, SessionResponseSchema,
  type ContractSchema,
} from "./index.js";

const date = "2026-08-23T12:00:00.000Z";
const key = "0123456789abcdef";
const queued = { id: "conv_1", originalFilename: "test.pdf", status: "queued", acceptedAt: date, sourceExpiresAt: date, downloadable: false };
const processing = { ...queued, status: "processing" };
const completed = { ...queued, status: "completed", completedAt: date, zipExpiresAt: date, downloadable: true };
const failed = { ...queued, status: "failed", failureMessage: "Conversion failed" };

type BoundaryCase = { name: string; schema: ContractSchema<unknown>; valid: unknown; invalid: unknown };
const boundaries: BoundaryCase[] = [
  { name: "register request", schema: RegisterRequestSchema, valid: { version: "v1", email: "a@example.test", password: "password" }, invalid: { version: "v1", email: "bad", password: "short" } },
  { name: "login request", schema: LoginRequestSchema, valid: { version: "v1", email: "a@example.test", password: "password" }, invalid: { version: "v2", email: "a@example.test", password: "password" } },
  { name: "session response", schema: SessionResponseSchema, valid: { version: "v1", user: { id: "user_1", email: "a@example.test", isAdmin: false }, csrfToken: key, creditBalance: 3, creditDeficit: 0 }, invalid: { version: "v1", user: { id: "user_1", email: "a@example.test", isAdmin: false }, csrfToken: key, creditBalance: 3, creditDeficit: 0, sessionToken: "secret" } },
  { name: "logout response", schema: LogoutResponseSchema, valid: { version: "v1", loggedOut: true }, invalid: { version: "v1", loggedOut: false } },
  { name: "checkout request", schema: CreateCheckoutRequestSchema, valid: { version: "v1", quantity: 2 }, invalid: { version: "v1", quantity: 0 } },
  { name: "checkout response", schema: CreateCheckoutResponseSchema, valid: { version: "v1", checkoutId: "cs_1", checkoutUrl: "https://checkout.test/x", quantity: 2, unitPriceCents: 500, totalCents: 1000, currency: "USD" }, invalid: { version: "v1", checkoutId: "cs_1", checkoutUrl: "https://checkout.test/x", quantity: 2, unitPriceCents: 500, totalCents: 999, currency: "USD" } },
  { name: "billing response", schema: BillingSummaryResponseSchema, valid: { version: "v1", creditBalance: 2, creditDeficit: 0, unitPriceCents: 500, currency: "USD" }, invalid: { version: "v1", creditBalance: -1, creditDeficit: 0, unitPriceCents: 500, currency: "USD" } },
  { name: "upload request", schema: AcceptUploadRequestSchema, valid: { version: "v1", uploadId: "up_1", originalFilename: "test.pdf", contentType: "application/pdf", sizeBytes: 42, idempotencyKey: key }, invalid: { version: "v1", uploadId: "up_1", originalFilename: "test.pdf", contentType: "application/pdf", sizeBytes: 42, idempotencyKey: key, privatePath: "/srv/private/test.pdf" } },
  { name: "upload response", schema: AcceptUploadResponseSchema, valid: { version: "v1", conversion: queued, creditBalance: 2, accepted: true }, invalid: { version: "v1", conversion: queued, creditBalance: 2, accepted: false } },
  { name: "conversion response", schema: ConversionResponseSchema, valid: { version: "v1", conversion: completed }, invalid: { version: "v1", conversion: { ...queued, downloadable: true } } },
  { name: "library request", schema: LibraryRequestSchema, valid: { version: "v1", cursor: "next_1", limit: 20 }, invalid: { version: "v1", limit: 101 } },
  { name: "library response", schema: LibraryResponseSchema, valid: { version: "v1", items: [queued, failed], nextCursor: "next_1" }, invalid: { version: "v1", items: [{ ...failed, failureMessage: undefined }] } },
  { name: "download request", schema: DownloadRequestSchema, valid: { version: "v1", conversionId: "conv_1" }, invalid: { version: "v1", conversionId: "conv_1", ownerId: "user_1" } },
  { name: "download response", schema: DownloadResponseSchema, valid: { version: "v1", downloadUrl: "https://example.test/signed", expiresAt: date, filename: "test.zip" }, invalid: { version: "v1", downloadUrl: "https://example.test/signed", expiresAt: date, filename: "test.zip", storageKey: "private/key" } },
  { name: "admin list request", schema: AdminListRequestSchema, valid: { version: "v1", status: "failed", limit: 10 }, invalid: { version: "v1", status: "cancelled" } },
  { name: "admin list response", schema: AdminListResponseSchema, valid: { version: "v1", items: [{ ...processing, userId: "user_1", attemptCount: 1 }] }, invalid: { version: "v1", items: [{ ...processing, userId: "user_1", attemptCount: -1 }] } },
  { name: "admin retry request", schema: AdminRetryRequestSchema, valid: { version: "v1", conversionId: "conv_1", reason: "Retry transient failure", idempotencyKey: key }, invalid: { version: "v1", conversionId: "conv_1", reason: "x", idempotencyKey: key } },
  { name: "admin credit request", schema: AdminCreditAdjustmentRequestSchema, valid: { version: "v1", userId: "user_1", deltaCredits: -2, reason: "Manual reconciliation", idempotencyKey: key }, invalid: { version: "v1", userId: "user_1", deltaCredits: 0, reason: "Manual reconciliation", idempotencyKey: key } },
  { name: "admin action response", schema: AdminActionResponseSchema, valid: { version: "v1", accepted: true, operationId: "op_1" }, invalid: { version: "v1", accepted: false, operationId: "op_1" } },
  { name: "API error response", schema: ApiErrorResponseSchema, valid: { version: "v1", error: { code: "NOT_FOUND", message: "Resource not found", retryable: false } }, invalid: { version: "v1", error: { code: "NOT_FOUND", message: "Owned by user_2 at /srv/private/a.pdf", retryable: false } } },
];

describe("API contracts", () => {
  it.each(boundaries)("validates the $name boundary", ({ schema, valid, invalid }) => {
    expect(schema.safeParse(valid).success).toBe(true);
    expect(schema.safeParse(invalid).success).toBe(false);
  });

  it.each([queued, processing, completed, failed])("accepts conversion state $status", (conversion) => {
    expect(ConversionResponseSchema.safeParse({ version: "v1", conversion }).success).toBe(true);
  });

  it.each([
    { ...queued, completedAt: date }, { ...queued, zipExpiresAt: date }, { ...queued, failureMessage: "bad" }, { ...queued, downloadable: true },
    { ...processing, completedAt: date }, { ...processing, downloadable: true },
    { ...completed, completedAt: undefined }, { ...completed, zipExpiresAt: undefined }, { ...completed, failureMessage: "bad" },
    { ...failed, failureMessage: undefined }, { ...failed, completedAt: date }, { ...failed, zipExpiresAt: date }, { ...failed, downloadable: true },
  ])("rejects invalid conversion state %#", (conversion) => {
    expect(ConversionResponseSchema.safeParse({ version: "v1", conversion }).success).toBe(false);
  });

  it.each(["2", true, false, null, Number.NaN, Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY])("rejects coerced admin delta %s", (deltaCredits) => {
    const request = { version: "v1", userId: "user_1", deltaCredits, reason: "Manual reconciliation", idempotencyKey: key };
    expect(AdminCreditAdjustmentRequestSchema.safeParse(request).success).toBe(false);
  });

  it.each(["Owned by user_2", "/srv/private/a.pdf", "secret=sk_live_123"])('rejects public error text "%s"', (message) => {
    expect(ApiErrorResponseSchema.safeParse({ version: "v1", error: { code: "NOT_FOUND", message, retryable: false } }).success).toBe(false);
  });
});
