resource "null_resource" "app" {
  triggers = {
    kubeconfig            = var.kubeconfig_path
    services_json_str     = base64encode(jsonencode(var.services))
    gh_repo               = var.gh_repo
    gh_ref                = var.gh_ref
    workflow              = var.workflow
    gh_params             = join(" ", [for key, value in var.parameters : "-f ${key}='${value}'"])
    timeout               = var.timeout
    wait_workflow_success = var.wait_workflow_success
    check_before_destroy  = var.check_before_destroy
  }

  lifecycle {
    ignore_changes = all
  }

  provisioner "local-exec" {
    when        = create
    interpreter = ["bash", "-c"]
    environment = {
      KUBECONFIG  = var.kubeconfig_path
      JOB_TIMEOUT = var.timeout
    }
    command = <<-EOT
        uv run ${path.module}/app_ops.py deploy \
          --workflow ${self.triggers.workflow} \
          --repo ${self.triggers.gh_repo} \
          --ref ${self.triggers.gh_ref} \
          --params-b64 ${base64encode(self.triggers.gh_params)} \
          --wait-workflow-success ${self.triggers.wait_workflow_success} \
          --services-json-b64 ${self.triggers.services_json_str}
    EOT
  }

  provisioner "local-exec" {
    when        = destroy
    interpreter = ["bash", "-c"]
    environment = {
      KUBECONFIG = self.triggers.kubeconfig
    }
    command = <<-EOT
        uv run ${path.module}/app_ops.py check-destroy \
          --check-before-destroy ${self.triggers.check_before_destroy} \
          --services-json-b64 ${self.triggers.services_json_str}
    EOT
  }
}

resource "null_resource" "finalizer" {
  depends_on = [null_resource.app]
  count      = var.finalizer == null ? 0 : 1
  triggers = {
    kubeconfig            = var.kubeconfig_path
    services_json_str     = base64encode(jsonencode(var.services))
    gh_repo               = var.gh_repo
    gh_ref                = var.gh_ref
    workflow              = var.finalizer.workflow
    gh_params             = join(" ", [for key, value in var.finalizer.parameters : "-f ${key}='${value}'"])
    timeout               = var.timeout
    wait_workflow_success = var.wait_workflow_success
  }

  lifecycle {
    ignore_changes = all
  }

  provisioner "local-exec" {
    when        = destroy
    interpreter = ["bash", "-c"]
    environment = {
      KUBECONFIG  = self.triggers.kubeconfig
      JOB_TIMEOUT = self.triggers.timeout
    }
    command = <<-EOT
        uv run ${path.module}/app_ops.py finalize \
          --workflow ${self.triggers.workflow} \
          --repo ${self.triggers.gh_repo} \
          --ref ${self.triggers.gh_ref} \
          --params-b64 ${base64encode(self.triggers.gh_params)} \
          --wait-workflow-success ${self.triggers.wait_workflow_success} \
          --services-json-b64 ${self.triggers.services_json_str}
    EOT
  }
}