import { Controller, Get, Inject } from '@nestjs/common';
import {
  HealthCheckService,
  HealthCheck,
  HealthCheckResult,
} from '@nestjs/terminus';
import { MESSAGE_PUBLISHER } from 'src/app.constants';
import { IPublishMessage } from 'src/interfaces/message-publisher';
import { RepositoriesHealthIndicatorUseCase } from '../../domain/usecases/repositories.health-indicator.usecase';

@Controller('health')
export class HealthController {
  constructor(
    private readonly repositoriesHealthIndicatorUseCase: RepositoriesHealthIndicatorUseCase,
    private healthCheckService: HealthCheckService,
    @Inject(MESSAGE_PUBLISHER)
    private readonly messagePublisher: IPublishMessage,
  ) {}

  @Get()
  @HealthCheck()
  async check() {
    try {
      return await this.healthCheckService.check([
        async () =>
          this.repositoriesHealthIndicatorUseCase.isHealthy('repositories'),
      ]);
    } catch (error) {
      const healthCheckResult: HealthCheckResult = error.response;
      this.messagePublisher.publish(
        'logging.user.health.crit',
        JSON.stringify(healthCheckResult.error),
      );
      throw error;
    }
  }
}