---
apiVersion: v1
kind: ConfigMap
metadata:
  name: webhook-build-script
  namespace: neonvortex
data:
  trigger-build.sh: |
    #!/bin/bash
    set -e

    echo "===== Git Push Detected - Triggering Build ====="
    date

    # Clone the repository
    echo "Cloning repository..."
    git clone http://192.168.1.49:13001/admin/neon-vortex.git /tmp/repo
    cd /tmp/repo

    # Get commit info
    GIT_COMMIT=$(git rev-parse HEAD)
    GIT_SHORT=$(git rev-parse --short HEAD)
    GIT_MSG=$(git log -1 --pretty=%B | head -1)
    GIT_AUTHOR=$(git log -1 --pretty=%an)

    echo "Commit: $GIT_SHORT ($GIT_COMMIT)"
    echo "Author: $GIT_AUTHOR"
    echo "Message: $GIT_MSG"

    # Generate unique job name
    TIMESTAMP=$(date +%s)
    JOB_NAME="build-${GIT_SHORT}-${TIMESTAMP}"

    echo "Creating build job: $JOB_NAME"

    # Send start notification
    curl -s -X POST "https://notify.caffeinetux.com/message?token=APMvTuncQJmm6vd" \
      -F "title=🔨 Neon Vortex Build Started" \
      -F "message=Commit: ${GIT_SHORT} by ${GIT_AUTHOR} - ${GIT_MSG}" \
      -F "priority=5" || echo "Notification failed"

    # Create the build job in flux-builds namespace
    kubectl apply -f - <<EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: $JOB_NAME
      namespace: flux-builds
      labels:
        app: neonvortex
        build-trigger: webhook
        git-commit: "$GIT_SHORT"
      annotations:
        git-commit-full: "$GIT_COMMIT"
        git-message: "$GIT_MSG"
        git-author: "$GIT_AUTHOR"
    spec:
      ttlSecondsAfterFinished: 1800
      backoffLimit: 0
      template:
        metadata:
          labels:
            app: neonvortex
            build-job: "true"
        spec:
          restartPolicy: Never
          initContainers:
          - name: git-clone
            image: alpine/git:latest
            command:
            - sh
            - -c
            - |
              set -e
              echo "Cloning and checking out $GIT_COMMIT..."
              git clone http://192.168.1.49:13001/admin/neon-vortex.git /workspace
              cd /workspace
              git checkout $GIT_COMMIT
              echo "Repository ready for build"
            env:
            - name: GIT_COMMIT
              value: "$GIT_COMMIT"
            volumeMounts:
            - name: workspace
              mountPath: /workspace
          containers:
          - name: kaniko
            image: gcr.io/kaniko-project/executor:latest
            args:
            - "--dockerfile=/workspace/htlm/Dockerfile"
            - "--context=/workspace/htlm"
            - "--destination=images.caffeinetux.com/apps/neon-vortex:latest"
            - "--destination=images.caffeinetux.com/apps/neon-vortex:$GIT_SHORT"
            - "--cache=true"
            - "--cache-repo=images.caffeinetux.com/apps/neon-vortex/cache"
            - "--label=git.commit=$GIT_COMMIT"
            - "--label=git.short=$GIT_SHORT"
            - "--label=git.message=$GIT_MSG"
            - "--label=git.author=$GIT_AUTHOR"
            volumeMounts:
            - name: workspace
              mountPath: /workspace
            - name: docker-config
              mountPath: /kaniko/.docker
          - name: notify-completion
            image: alpine:latest
            command:
            - sh
            - -c
            - |
              set -e
              apk add --no-cache curl

              echo "Waiting for Kaniko to complete..."
              sleep 10

              # Send completion notification
              curl -s -X POST "https://notify.caffeinetux.com/message?token=APMvTuncQJmm6vd" \
                -F "title=✅ Neon Vortex Build Complete" \
                -F "message=Image built successfully for commit ${GIT_SHORT}. Deployment will update automatically." \
                -F "priority=5"

              echo "Completion notification sent"
            env:
            - name: GIT_SHORT
              value: "$GIT_SHORT"
          volumes:
          - name: workspace
            emptyDir: {}
          - name: docker-config
            secret:
              secretName: harbor-registry
              items:
              - key: .dockerconfigjson
                path: config.json
    EOF

    if [ $? -eq 0 ]; then
      echo "✅ Build job $JOB_NAME created successfully"
    else
      echo "❌ Failed to create build job"
      curl -s -X POST "https://notify.caffeinetux.com/message?token=APMvTuncQJmm6vd" \
        -F "title=❌ Neon Vortex Build Failed" \
        -F "message=Failed to create build job for commit ${GIT_SHORT}" \
        -F "priority=8"
      exit 1
    fi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-trigger-sa
  namespace: neonvortex
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: build-trigger-role
  namespace: flux-builds
rules:
- apiGroups: ["batch"]
  resources: ["jobs"]
  verbs: ["create", "get", "list", "watch", "delete"]
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: build-trigger-binding
  namespace: flux-builds
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: build-trigger-role
subjects:
- kind: ServiceAccount
  name: build-trigger-sa
  namespace: neonvortex
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webhook-build-listener
  namespace: neonvortex
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webhook-build-listener
  template:
    metadata:
      labels:
        app: webhook-build-listener
    spec:
      serviceAccountName: build-trigger-sa
      containers:
      - name: listener
        image: alpine/k8s:1.28.13
        command:
        - sh
        - -c
        - |
          apk add --no-cache socat bash git curl

          echo "Starting webhook listener on port 8080..."

          while true; do
            echo "Waiting for webhook trigger..."
            echo -e "HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK" | \
              socat TCP-LISTEN:8080,reuseaddr,fork STDIO | \
              while read line; do
                if echo "$line" | grep -q "POST /webhook"; then
                  echo "Webhook received! Triggering build..."
                  bash /scripts/trigger-build.sh &
                  break
                fi
              done
            sleep 2
          done
        volumeMounts:
        - name: script
          mountPath: /scripts
      volumes:
      - name: script
        configMap:
          name: webhook-build-script
          defaultMode: 0755
---
apiVersion: v1
kind: Service
metadata:
  name: webhook-build-listener
  namespace: neonvortex
spec:
  type: NodePort
  selector:
    app: webhook-build-listener
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30091
    name: webhook
