import {
  Injectable,
  Logger,
  OnApplicationShutdown,
  OnModuleInit,
} from "@nestjs/common";
import { closeDb } from "../../config/database.js";

const SERVICE_NAME = "classes";

/**
 * 优雅停机服务。
 *
 * 信号处理由 NestJS 在 `app.listen` 之前调用 `app.enableShutdownHooks()`
 * 触发（SIGTERM / SIGINT），NestJS 会依次调用 OnApplicationShutdown 钩子。
 * K8s 配置 `terminationGracePeriodSeconds=60` 给予足够时间清理。
 *
 * Classes 服务仅使用 Drizzle ORM（MySQL），无 Kafka / Redis 依赖。
 * 关闭时仅需关闭数据库连接池。
 */
@Injectable()
export class LifecycleService implements OnModuleInit, OnApplicationShutdown {
  private readonly logger = new Logger(LifecycleService.name);

  onModuleInit(): void {
    this.logger.log(`service ${SERVICE_NAME} module initialized`);
  }

  async onApplicationShutdown(signal?: string): Promise<void> {
    this.logger.log(
      `service ${SERVICE_NAME} shutting down (signal=${signal ?? "unknown"})`,
    );

    try {
      await closeDb();
      this.logger.log("database connection closed");
    } catch (error) {
      this.logger.error(
        `database close failed: ${error instanceof Error ? error.message : String(error)}`,
      );
    }

    this.logger.log(`service ${SERVICE_NAME} shutdown complete`);
  }
}
