/**
 * Vitest global setup
 *
 * Provides:
 * - `prisma` – a PrismaClient connected to DATABASE_URL (or DATABASE_URL_TEST)
 * - `createTestContext(user)` – builds a tRPC-compatible context with an
 *   authenticated user so callers can invoke router procedures directly.
 * - `createCaller(router, user)` – shorthand for creating a type-safe caller
 *   from any tRPC router.
 *
 * Test isolation strategy: each test file should use `cleanupTestData()` in
 * afterAll to remove data it created, keyed by unique program/user names.
 */

import { PrismaClient } from '@prisma/client'
import { afterAll } from 'vitest'
import type { UserRole } from '@prisma/client'

export const prisma = new PrismaClient({
  datasourceUrl: process.env.DATABASE_URL_TEST ?? process.env.DATABASE_URL,
})

afterAll(async () => {
  await prisma.$disconnect()
})

/**
 * Build a fake tRPC context with an authenticated user.
 * The returned object matches the shape expected by tRPC middleware
 * (session.user, prisma, ip, userAgent).
 */
export function createTestContext(user: {
  id: string
  email: string
  name?: string | null
  role: UserRole
}) {
  return {
    session: {
      user: {
        id: user.id,
        email: user.email,
        name: user.name ?? user.email,
        role: user.role,
      },
      expires: new Date(Date.now() + 86_400_000).toISOString(),
    },
    prisma,
    ip: '127.0.0.1',
    userAgent: 'vitest',
  }
}

/**
 * Create a tRPC caller for a given router, authenticated as `user`.
 * Usage:
 *   const caller = createCaller(pipelineRouter, adminUser)
 *   const result = await caller.create({ ... })
 */
export function createCaller<TRouter extends { createCaller: (ctx: any) => any }>(
  routerModule: { createCaller: (ctx: any) => any },
  user: { id: string; email: string; name?: string | null; role: UserRole },
) {
  const ctx = createTestContext(user)
  return routerModule.createCaller(ctx)
}
