import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '@/generated/prisma/client';

@Injectable()
export class PrismaService
  extends PrismaClient
  implements OnModuleInit, OnModuleDestroy
{
  constructor() {
    const connectionString = process.env.DATABASE_URL;

    if (!connectionString) {
      throw new Error('DATABASE_URL is missing in .env');
    }

    const adapter = new PrismaPg({
      connectionString,
    });

    super({ adapter });
  }

  async onModuleInit() {
    try {
      await this.$connect();
    } catch (error) {
      throw new Error(
        [
          'Database connection failed.',
          'Make sure PostgreSQL is running and DATABASE_URL points to it.',
          'For local development, start Docker Desktop and run: npm run db:up',
          `Original error: ${error instanceof Error ? error.message : String(error)}`,
        ].join('\n'),
      );
    }
  }

  async onModuleDestroy() {
    await this.$disconnect();
  }
}
