import type { ComponentContext } from "@catladder/pipeline";
import { getKubernetesNamespace } from "@catladder/pipeline";
import type { V1ObjectMeta } from "@kubernetes/client-node";
import { V1Namespace } from "@kubernetes/client-node";
import { getk8sApi } from "../../../../../k8sApi";

export default async function (context: ComponentContext) {
  const namespace = getKubernetesNamespace(context.fullConfig, context.env);
  const namespaceBody = new V1Namespace();
  const metadata: V1ObjectMeta = {
    name: namespace,
    labels: {
      customerName: context.fullConfig.customerName,
      appName: context.fullConfig.appName,
      environment: context.env,
      components: Object.keys(context.fullConfig.components).join("_"), // limited chars available...

      ...(context.fullConfig.meta?.labels ?? {}),
    },
  };

  namespaceBody.metadata = metadata;
  const k8sApi = getk8sApi();
  try {
    await k8sApi.readNamespace(namespace);

    await k8sApi.patchNamespace(
      namespace,
      namespaceBody,
      undefined,
      undefined,
      undefined,
      undefined,
      { headers: { "content-type": "application/merge-patch+json" } }, // see https://github.com/kubernetes-client/javascript/issues/443
    ); // update meta data
  } catch (e) {
    if (e.response?.body?.reason === "NotFound") {
      await k8sApi.createNamespace(namespaceBody);
    } else {
      console.error(e.response?.body);
      throw e;
    }
  }
  return namespace;
}
