import { PrismaClient } from '@prisma/client'
import { PrismaPg } from '@prisma/adapter-pg'
import { Pool } from 'pg'

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined
}

const connectionString = process.env.DATABASE_URL

if (!connectionString) {
  throw new Error('DATABASE_URL environment variable is not set')
}

// Handle Prisma Postgres URLs (prisma+postgres://) vs standard PostgreSQL URLs
let pool: Pool
if (connectionString.startsWith('prisma+postgres://')) {
  // For Prisma managed Postgres, extract the actual postgres URL from the API key
  try {
    const urlMatch = connectionString.match(/api_key=([^"&]+)/)
    if (urlMatch) {
      const apiKey = decodeURIComponent(urlMatch[1])
      const decoded = JSON.parse(Buffer.from(apiKey, 'base64').toString())
      if (decoded.databaseUrl) {
        pool = new Pool({ connectionString: decoded.databaseUrl })
      } else if (decoded.shadowDatabaseUrl) {
        pool = new Pool({ connectionString: decoded.shadowDatabaseUrl })
      } else {
        throw new Error('Could not extract database URL from Prisma Postgres connection string')
      }
    } else {
      throw new Error('Invalid Prisma Postgres connection string format')
    }
  } catch (error) {
    console.error('Error parsing Prisma Postgres URL:', error)
    throw new Error('Failed to parse Prisma Postgres connection string. Consider using a standard PostgreSQL connection string.')
  }
} else {
  // Standard PostgreSQL connection
  pool = new Pool({ connectionString })
}

const adapter = new PrismaPg(pool)
export const prisma = globalForPrisma.prisma ?? new PrismaClient({ adapter })

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
