// /pages/api/health.js
export default async function handler(req, res) {
  const basePath = "talas5";
  const protocol = "http";
  const hostname = "10.10.0.70";
  const port = "80";
  const idMap = "12";
  const idUser = "484";
  const idLD = "50922";

  const buildUrl = method =>
    `${protocol}://${hostname}:${port}/${basePath}/ClientData/WebServiceMap.asmx/${method}?idMap=${idMap}&idUser=${idUser}`;

  const externalUrls = {
    GisStationsStaticDistrict: buildUrl("GisStationsStaticDistrict"),
    GisLinesStatus: `${protocol}://${hostname}:${port}/${basePath}/ClientData/WebServiceMap.asmx/GisLinesStatus?idMap=${idMap}`,
    GisStationsMeasurements: buildUrl("GisStationsMeasurements"),
    GisStationsStatusDistrict: buildUrl("GisStationsStatusDistrict"),
    GisSystemStatic: buildUrl("GisSystemStatic"),
  };

  const internalApiBase = "http://localhost:3000";

  const internalApis = {
    //area
    readArea: `${internalApiBase}/api/talas_v5_DB/area/readArea?m=${idMap}`,
    //device
    getAllStationsNames: `${internalApiBase}/api/talas_v5_DB/device/getAllStationsNames`,
    getDevices: `${internalApiBase}/api/talas_v5_DB/device/getDevices`,
    //gisLines
    readGisLines: `${internalApiBase}/api/talas_v5_DB/gisLines/readGisLines`,
    //locationDevice
    getDeviceId: `${internalApiBase}/api/talas_v5_DB/locationDevice/getDeviceId`,
    locationDeviceNameById: `${internalApiBase}/api/talas_v5_DB/locationDevice/locationDeviceNameById?idLD=${idLD}`,
    locationDevices: `${internalApiBase}/api/talas_v5_DB/locationDevice/locationDevices`,
    //pois
    addPoi: `${internalApiBase}/api/talas_v5_DB/pois/addPoi`,
    deletePoi: `${internalApiBase}/api/talas_v5_DB/pois/deletePoi`,
    getPoiById: `${internalApiBase}/api/talas_v5_DB/pois/getPoiById`,
    poiIcons: `${internalApiBase}/api/talas_v5_DB/pois/poi-icons`,
    readAllPOIs: `${internalApiBase}/api/talas_v5_DB/pois/readAllPOIs`,
    updateLocation: `${internalApiBase}/api/talas_v5_DB/pois/updateLocation`,
    updatePoi: `${internalApiBase}/api/talas_v5_DB/pois/updatePoi`,
    //poiTyp
    readPoiTyp: `${internalApiBase}/api/talas_v5_DB/poiTyp/readPoiTyp`,
    //station
    getAllStationsNames: `${internalApiBase}/api/talas_v5_DB/station/getAllStationsNames`,
    getDevices: `${internalApiBase}/api/talas_v5_DB/station/getDevices`,
    //
    priorityConfig: `${internalApiBase}/api/talas_v5_DB/priorityConfig`,
  };

  const results = {};

  // Prüfe externe Webservices
  await Promise.all(
    Object.entries(externalUrls).map(async ([name, url]) => {
      try {
        const response = await fetch(url);
        results[name] = {
          ok: response.ok,
          status: response.status,
          url,
        };

        if (name === "GisSystemStatic" && response.ok) {
          const data = await response.json();
          results["UserRights"] = {
            ok: Array.isArray(data.Rights),
            length: data.Rights?.length || 0,
          };
        }
      } catch (error) {
        results[name] = {
          ok: false,
          error: error.message,
          url,
        };
      }
    })
  );

  // Prüfe interne API-Routen
  await Promise.all(
    Object.entries(internalApis).map(async ([name, url]) => {
      try {
        const response = await fetch(url);
        results[`API_${name}`] = {
          ok: response.ok,
          status: response.status,
          url,
        };
      } catch (error) {
        results[`API_${name}`] = {
          ok: false,
          error: error.message,
          url,
        };
      }
    })
  );

  // Prüfe Mock-Status
  const useMocksEnv = process.env.NEXT_PUBLIC_USE_MOCKS;
  results["MockMode"] = {
    expected: "false",
    actual: useMocksEnv,
    ok: useMocksEnv === "false",
    info:
      useMocksEnv === "false"
        ? "✅ Mockdaten deaktiviert – Live-Daten aktiv."
        : "⚠️ Mockdaten aktiv – nicht für Produktion geeignet!",
  };

  // Prüfe Konfiguration der .env.production
  results["envConfig"] = {
    NODE_ENV: process.env.NODE_ENV || "undefined",
    DB_HOST: process.env.DB_HOST || "❌ fehlt",
    NEXT_PUBLIC_USE_MOCKS: useMocksEnv || "❌ fehlt",
    status:
      process.env.NODE_ENV === "production" && useMocksEnv === "false" && process.env.DB_HOST
        ? "✅ .env.production scheint korrekt."
        : "⚠️ Bitte .env.production prüfen – möglicherweise fehlt etwas.",
  };

  const allOk = Object.values(results).every(r => r.ok);

  res.status(allOk ? 200 : 207).json({
    status: allOk ? "ok" : "partial",
    version: "1.0.0",
    services: results,
  });
}
