import fs from 'fs';
import { setTimeout as setTimeoutAsync } from 'timers/promises';
import { getRedisClient } from '../external-services/redis.js';
import query from '../server-utils/query.js';
import { declareHandler } from '../server-utils/routesHandler.js';
import { registerShutdownHandler } from '../utils/platformEventHandling.js';

/**
 * This file contains route handlers for the healthcheck API.
 */

let shuttingDown = false;

registerShutdownHandler(() => {
  shuttingDown = true;
});

async function healthCheck() {
  const preShutdownUnhealthyForALB = fs.existsSync('/tmp/healthcheck-unhealthy');
  if (shuttingDown || preShutdownUnhealthyForALB) {
    return false;
  }
  await query('SELECT 1', []);
  await getRedisClient().ping();
  return true;
}

export const databaseAndRedisHealthCheck = declareHandler({
  func: async (req, res) => {
    let healthy = false;
    try {
      healthy = await Promise.race([healthCheck(), setTimeoutAsync(4000, false)]);
    } catch (e) {
      console.log('exception in healthcheck ');
      console.error(e);
    }

    res.status(healthy ? 200 : 503);
    res.send({ healthy });
  },
});

export const healthCheckReachable = declareHandler({
  func: async (req, res) => {
    res.status(200);
    res.send({ ok: true });
  },
});
