
resource "kubernetes_config_map" "wireguard_config" {
  metadata {
    name      = "wireguard-config"
    namespace = kubernetes_namespace.m3uproxy.metadata[0].name
  }

  data = {
    "wireguard.conf" = local.wireguard_config
  }
}

resource "kubernetes_config_map" "squid_config" {
  metadata {
    name      = "squid-config"
    namespace = kubernetes_namespace.m3uproxy.metadata[0].name
  }

  data = {
    "squid.conf" = local.squid_config
  }

}

resource "kubernetes_deployment" "proxy_pt" {
  metadata {
    name      = "proxy-pt"
    namespace = kubernetes_namespace.m3uproxy.metadata[0].name
    annotations = {
      "security.alpha.kubernetes.io/unsafe-sysctls" = "net.ipv4.conf.all.src_valid_mark=1"
    }
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app = "proxy-pt"
      }
    }

    strategy {
      type = "Recreate"
    }

    template {
      metadata {
        labels = {
          app = "proxy-pt"
        }
        annotations = {
          "checksum/squid"     = local.squid_config_checksum
          "checksum/wireguard" = local.wireguard_config_checksum
        }
      }

      spec {
        container {
          name  = "wireguard"
          image = "linuxserver/wireguard:${local.wireguard_version}"

          resources {
            requests = {
              memory = "64Mi"
            }
          }

          liveness_probe {
            exec {
              command = [
                "/bin/sh",
                "-c",
                "wg show | grep -q transfer"
              ]
            }
            initial_delay_seconds = 90
            period_seconds        = 90
          }

          security_context {
            privileged = true
            capabilities {
              add = ["NET_ADMIN"]
            }
          }

          env {
            name  = "PUID"
            value = "1000"
          }

          env {
            name  = "PGID"
            value = "1000"
          }

          env {
            name  = "TZ"
            value = "Europe/Berlin"
          }

          volume_mount {
            name       = "wireguard-config"
            mount_path = "/config/wg_confs"
            read_only  = true
          }

          volume_mount {
            name       = "lib-modules"
            mount_path = "/lib/modules"
            read_only  = true
          }
        }

        container {
          name  = "squid"
          image = "ubuntu/squid:${local.squid_version}"

          port {
            container_port = 3128
            name           = "proxy"
            protocol       = "TCP"
          }

          readiness_probe {
            tcp_socket {
              port = "proxy"
            }
            initial_delay_seconds = 10
            timeout_seconds       = 4
          }

          liveness_probe {
            tcp_socket {
              port = "proxy"
            }
            initial_delay_seconds = 10
            timeout_seconds       = 4
          }

          resources {
            requests = {
              memory = "256Mi"
            }
          }

          security_context {
            allow_privilege_escalation = false
            run_as_user                = 1000
            run_as_group               = 1000
          }

          volume_mount {
            name       = "squid-config"
            mount_path = "/etc/squid"
            read_only  = true
          }

          volume_mount {
            name       = "squid-data"
            mount_path = "/var/spol/squid"
          }

        }

        volume {
          name = "wireguard-config"
          config_map {
            name = kubernetes_config_map.wireguard_config.metadata[0].name
          }
        }

        volume {
          name = "lib-modules"
          host_path {
            path = "/lib/modules"
          }
        }

        volume {
          name = "squid-config"
          config_map {
            name = kubernetes_config_map.squid_config.metadata[0].name
          }
        }

        volume {
          name = "squid-data"
          host_path {
            path = local.squid_app_path
          }
        }
      }
    }
  }

  lifecycle {
    ignore_changes = [spec[0].template[0].metadata[0].annotations["kubectl.kubernetes.io/restartedAt"]]
  }
}

resource "kubernetes_service" "proxy_pt" {
  metadata {
    name      = "proxy-pt"
    namespace = kubernetes_namespace.m3uproxy.metadata[0].name
  }

  spec {
    selector = {
      app = "proxy-pt"
    }
    port {
      port = 3128
    }
    cluster_ip = "None"
  }
}
