# Deploy workflow: Docker image → push to registry → Portainer webhook.
# Runs on push to main, tag, or manual (only when on main).
# Waits for ci workflow (install → lint → build → test) to succeed first.
when:
    - branch: main
      event: [push, tag, manual]
    - event: deployment
      evaluate: 'CI_PIPELINE_DEPLOY_TARGET == "production"'

depends_on:
    - ci

steps:
    - name: 'Docker image build'
      image: docker:latest
      environment:
          DOCKER_API_VERSION: '1.43'
          REGISTRY_REPO: git.mifi.dev/mifi-ventures/landing
      volumes:
          - /var/run/docker.sock:/var/run/docker.sock
      commands:
          - set -e
          - apk add --no-cache jq
          - APP_VERSION=$(jq -r .version package.json | tr -d '\r\n' | sed 's/^v//')
          - echo "=== Building Docker image ==="
          - 'echo "Commit SHA: ${CI_COMMIT_SHA:0:8}"'
          - 'echo "Registry repo: $REGISTRY_REPO"'
          - 'echo "App version: $APP_VERSION"'
          - |
              docker build \
                --tag "$REGISTRY_REPO:$CI_COMMIT_SHA" \
                --tag "$REGISTRY_REPO:latest" \
                --tag "$REGISTRY_REPO:$APP_VERSION" \
                --label "git.commit=${CI_COMMIT_SHA}" \
                --label "git.branch=${CI_COMMIT_BRANCH}" \
                .
          - echo "✓ Docker image built successfully"

    - name: Send Build Status Notification (success)
      image: curlimages/curl
      environment:
          MATTERMOST_BOT_ACCESS_TOKEN:
              from_secret: mattermost_bot_access_token
          MATTERMOST_CHANNEL_ID:
              from_secret: mattermost_pushes_channel_id
          MATTERMOST_POST_API_URL:
              from_secret: mattermost_post_api_url
      commands:
          - |
              BODY=$(printf '{"channel_id":"%s","message":"[%s - Build #%s] Build success 🎉"}' "$MATTERMOST_CHANNEL_ID" "$CI_REPO" "$CI_PIPELINE_NUMBER")
              curl -sS -X POST -H "Content-Type: application/json" -d "$BODY" -H "Authorization: Bearer $MATTERMOST_BOT_ACCESS_TOKEN" $MATTERMOST_POST_API_URL
      depends_on:
          - 'Docker image build'
      when:
          - status: [success]

    - name: Send Build Status Notification (failure)
      image: curlimages/curl
      environment:
          MATTERMOST_BOT_ACCESS_TOKEN:
              from_secret: mattermost_bot_access_token
          MATTERMOST_CHANNEL_ID:
              from_secret: mattermost_pushes_channel_id
          MATTERMOST_POST_API_URL:
              from_secret: mattermost_post_api_url
      commands:
          - |
              BODY=$(printf '{"channel_id":"%s","message":"[%s - Build #%s] Build failure 💩"}' "$MATTERMOST_CHANNEL_ID" "$CI_REPO" "$CI_PIPELINE_NUMBER")
              curl -sS -X POST -H "Content-Type: application/json" -d "$BODY" -H "Authorization: Bearer $MATTERMOST_BOT_ACCESS_TOKEN" $MATTERMOST_POST_API_URL
      depends_on:
          - Docker image build
      when:
          - status: [failure]

    - name: 'Push to registry'
      image: docker:latest
      environment:
          DOCKER_API_VERSION: '1.43'
          REGISTRY_URL: git.mifi.dev
          REGISTRY_REPO: git.mifi.dev/mifi-ventures/landing
          REGISTRY_USERNAME:
              from_secret: registry_username
          REGISTRY_PASSWORD:
              from_secret: registry_password
      volumes:
          - /var/run/docker.sock:/var/run/docker.sock
      commands:
          - set -e
          - apk add --no-cache jq
          - APP_VERSION=$(jq -r .version package.json | tr -d '\r\n' | sed 's/^v//')
          - echo "=== Pushing to registry ==="
          - 'echo "Registry: $REGISTRY_URL"'
          - 'echo "Repository: $REGISTRY_REPO"'
          - 'echo "App version: $APP_VERSION"'
          - |
              echo "$REGISTRY_PASSWORD" | docker login "$REGISTRY_URL" \
                -u "$REGISTRY_USERNAME" \
                --password-stdin
          - 'docker push $REGISTRY_REPO:$CI_COMMIT_SHA'
          - 'docker push $REGISTRY_REPO:latest'
          - 'docker push $REGISTRY_REPO:$APP_VERSION'
          - echo "✓ Images pushed successfully"
      depends_on:
          - 'Docker image build'

    - name: Send Push Status Notification (success)
      image: curlimages/curl
      environment:
          MATTERMOST_BOT_ACCESS_TOKEN:
              from_secret: mattermost_bot_access_token
          MATTERMOST_CHANNEL_ID:
              from_secret: mattermost_pushes_channel_id
          MATTERMOST_POST_API_URL:
              from_secret: mattermost_post_api_url
      commands:
          - |
              BODY=$(printf '{"channel_id":"%s","message":"[%s - Build #%s] Push to registry success 🎉"}' "$MATTERMOST_CHANNEL_ID" "$CI_REPO" "$CI_PIPELINE_NUMBER")
              curl -sS -X POST -H "Content-Type: application/json" -d "$BODY" -H "Authorization: Bearer $MATTERMOST_BOT_ACCESS_TOKEN" $MATTERMOST_POST_API_URL
      depends_on:
          - 'Push to registry'
      when:
          - status: [success]

    - name: Send Push Status Notification (failure)
      image: curlimages/curl
      environment:
          MATTERMOST_BOT_ACCESS_TOKEN:
              from_secret: mattermost_bot_access_token
          MATTERMOST_CHANNEL_ID:
              from_secret: mattermost_pushes_channel_id
          MATTERMOST_POST_API_URL:
              from_secret: mattermost_post_api_url
      commands:
          - |
              BODY=$(printf '{"channel_id":"%s","message":"[%s - Build #%s] Push to registry failure 💩"}' "$MATTERMOST_CHANNEL_ID" "$CI_REPO" "$CI_PIPELINE_NUMBER")
              curl -sS -X POST -H "Content-Type: application/json" -d "$BODY" -H "Authorization: Bearer $MATTERMOST_BOT_ACCESS_TOKEN" $MATTERMOST_POST_API_URL
      depends_on:
          - 'Push to registry'
      when:
          - status: [failure]

    - name: 'Trigger Portainer stack redeploy'
      image: curlimages/curl:latest
      environment:
          PORTAINER_WEBHOOK_URL:
              from_secret: portainer_webhook_url
      commands:
          - set -e
          - echo "=== Triggering Portainer stack redeploy ==="
          - |
              resp=$(curl -s -w "\n%{http_code}" -X POST "$PORTAINER_WEBHOOK_URL")
              body=$(echo "$resp" | head -n -1)
              code=$(echo "$resp" | tail -n 1)
              if [ "$code" != "200" ] && [ "$code" != "204" ]; then
                echo "Webhook failed (HTTP $code): $body"
                exit 1
              fi
              echo "✓ Portainer redeploy triggered (HTTP $code)"
      depends_on:
          - 'Push to registry'

    - name: Send Deploy Status Notification (success)
      image: curlimages/curl
      environment:
          MATTERMOST_BOT_ACCESS_TOKEN:
              from_secret: mattermost_bot_access_token
          MATTERMOST_CHANNEL_ID:
              from_secret: mattermost_pushes_channel_id
          MATTERMOST_POST_API_URL:
              from_secret: mattermost_post_api_url
      commands:
          - |
              BODY=$(printf '{"channel_id":"%s","message":"[%s - Build #%s] Production Deploy success 🎉"}' "$MATTERMOST_CHANNEL_ID" "$CI_REPO" "$CI_PIPELINE_NUMBER")
              curl -sS -X POST -H "Content-Type: application/json" -d "$BODY" -H "Authorization: Bearer $MATTERMOST_BOT_ACCESS_TOKEN" $MATTERMOST_POST_API_URL
      depends_on:
          - 'Trigger Portainer stack redeploy'
      when:
          - status: [success]

    - name: Send Deploy Status Notification (failure)
      image: curlimages/curl
      environment:
          MATTERMOST_BOT_ACCESS_TOKEN:
              from_secret: mattermost_bot_access_token
          MATTERMOST_CHANNEL_ID:
              from_secret: mattermost_pushes_channel_id
          MATTERMOST_POST_API_URL:
              from_secret: mattermost_post_api_url
      commands:
          - |
              BODY=$(printf '{"channel_id":"%s","message":"[%s - Build #%s] Production Deploy failure 💩"}' "$MATTERMOST_CHANNEL_ID" "$CI_REPO" "$CI_PIPELINE_NUMBER")
              curl -sS -X POST -H "Content-Type: application/json" -d "$BODY" -H "Authorization: Bearer $MATTERMOST_BOT_ACCESS_TOKEN" $MATTERMOST_POST_API_URL
      depends_on:
          - Trigger Portainer stack redeploy
      when:
          - status: [failure]
