name: '[docker image]'

on:
  push:
    # do not rebuild if...
    paths-ignore:
      # changes to .openshift directory... mostly devops config
      - '.openshift/*'
      # docs (docs are built on readthedocs any way)
      - 'docs/*'

jobs:
  build-docker-img:
    runs-on: ubuntu-latest
    env:
      MATOMO_ID_PROD: '12'
      MATOMO_URL_PROD: 'https://stats.humanbrainproject.eu/'
      PRODUCTION: 'true'
      DOCKER_REGISTRY: 'docker-registry.ebrains.eu/siibra/'

      SIIBRA_API_STABLE: 'https://siibra-api-stable.apps.hbp.eu/v1_0'
      SIIBRA_API_RC: 'https://siibra-api-rc.apps.hbp.eu/v1_0'
      SIIBRA_API_LATEST: 'https://siibra-api-latest.apps-dev.hbp.eu/v1_0'


    steps:
    - uses: actions/checkout@v2
    - name: 'Set matomo env var'
      run: |
        echo "Using github.ref: $GITHUB_REF"

        echo "BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
        
        echo "MATOMO_URL=${{ env.MATOMO_URL_PROD }}" >> $GITHUB_ENV
        echo "MATOMO_ID=${{ env.MATOMO_ID_PROD }}" >> $GITHUB_ENV

        if [[ "$GITHUB_REF" == 'refs/heads/master' ]]
        then
          echo "Either master, using prod env..."
          echo "BS_REST_URL=${{ env.SIIBRA_API_STABLE }}" >> $GITHUB_ENV
        elif [[ "$GITHUB_REF" == 'refs/heads/staging' ]]
        then
          echo "Either staging, using staging env..."
          echo "BS_REST_URL=${{ env.SIIBRA_API_RC }}" >> $GITHUB_ENV
        else
          if [[ "$GITHUB_REF" == *hotfix* ]]
          then
            echo "Hotfix branch, using prod env..."
            echo "BS_REST_URL=${{ env.SIIBRA_API_RC }}" >> $GITHUB_ENV
          else
            echo "Using dev env..."
            echo "BS_REST_URL=${{ env.SIIBRA_API_LATEST }}" >> $GITHUB_ENV
          fi
        fi

    - name: 'Set version variable & expmt feature flag'
      run: |
        GIT_HASH=$(git rev-parse --short HEAD)
        echo "Setting GIT_HASH: $GIT_HASH"
        echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV

        VERSION=$(jq -r '.version' package.json)
        echo "Setting VERSION: $VERSION"
        echo "VERSION=$VERSION" >> $GITHUB_ENV
        if [[ "$GITHUB_REF" == 'refs/heads/master' ]] || [[ "$GITHUB_REF" == 'refs/heads/staging' ]]
        then
          echo "prod/staging build, do not enable experimental features"
        else
          echo "dev bulid, enable experimental features"
          echo "EXPERIMENTAL_FEATURE_FLAG=true" >> $GITHUB_ENV
        fi
    - name: 'Build docker image'
      run: |
        DOCKER_BUILT_TAG=${{ env.DOCKER_REGISTRY }}siibra-explorer:$BRANCH_NAME
        echo "Building $DOCKER_BUILT_TAG"
        docker build \
          --build-arg GIT_HASH=$GIT_HASH \
          --build-arg VERSION=$VERSION \
          --build-arg MATOMO_URL=$MATOMO_URL \
          --build-arg MATOMO_ID=$MATOMO_ID \
          --build-arg BS_REST_URL=$BS_REST_URL \
          --build-arg EXPERIMENTAL_FEATURE_FLAG=$EXPERIMENTAL_FEATURE_FLAG \
          -t $DOCKER_BUILT_TAG \
          .
        echo "Successfully built $DOCKER_BUILT_TAG"
        echo "DOCKER_BUILT_TAG=$DOCKER_BUILT_TAG" >> $GITHUB_ENV

    - name: 'Push to docker registry'
      run: |
        echo "Login to docker registry"
        docker login \
          -u '${{ secrets.EBRAINS_DOCKER_REG_USER }}' \
          -p '${{ secrets.EBRAINS_DOCKER_REG_TOKEN }}' \
          docker-registry.ebrains.eu
        echo "Pushing $DOCKER_BUILT_TAG"
        docker push $DOCKER_BUILT_TAG

  trigger-deploy:
    if: success()
    runs-on: ubuntu-latest
    env:
      GITHUB_API_ROOT: https://api.github.com/repos/fzj-inm1-bda/siibra-explorer
      OC_TEMPLATE_NAME: 'siibra-explorer-branch-deploy-2'

    needs: build-docker-img
    steps:
      - uses: actions/checkout@v2
      - name: Set env var
        run: |
          echo "Using github.ref: $GITHUB_REF"
          BRANCH_NAME=${GITHUB_REF#refs/heads/}
          echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
        
          echo "Branch is $BRANCH_NAME ."

          if [[ "$BRANCH_NAME" == 'master' ]]
          then
            echo "BUILD_TEXT=" >> $GITHUB_ENV
          else
            echo "BUILD_TEXT=$BRANCH_NAME" >> $GITHUB_ENV
          fi

          # DEPLOY_ID == remove _ / and lowercase everything from branch
          DEPLOY_ID=$(echo ${BRANCH_NAME//[_\/]/} | awk '{ print tolower($0) }')
          echo "DEPLOY_ID=$DEPLOY_ID" >> $GITHUB_ENV

          if [[ "$BRANCH_NAME" == 'master' ]] || [[ "$BRANCH_NAME" == 'staging' ]]
          then
            echo "OKD_URL=https://okd.hbp.eu:443" >> $GITHUB_ENV
            echo "OKD_SECRET=${{ secrets.OKD_PROD_SECRET }}" >> $GITHUB_ENV
            echo "OKD_PROJECT=interactive-viewer" >> $GITHUB_ENV
            echo "ROUTE_HOST=siibra-explorer.apps.hbp.eu" >> $GITHUB_ENV

            if [[ "$BRANCH_NAME" == 'master' ]]
            then
              FULL_DEPLOY_ID=siibra-explorer-branch-deploy-2-prodpathviewer
              FULL_DEPLOY_ID2=siibra-explorer-branch-deploy-2-iav-legacy
              echo "FULL_DEPLOY_ID=$FULL_DEPLOY_ID" >> $GITHUB_ENV
              echo "FULL_DEPLOY_ID2=$FULL_DEPLOY_ID2" >> $GITHUB_ENV
            else
              FULL_DEPLOY_ID=siibra-explorer-branch-deploy-2-stagingpathed
              echo "FULL_DEPLOY_ID=$FULL_DEPLOY_ID" >> $GITHUB_ENV
            fi

            echo "Deploy on **prod** cluster..."
            echo "Deploy id: **${FULL_DEPLOY_ID}** ..."
            if [ ! -z "$FULL_DEPLOY_ID2" ]
            then
              echo "Secondary deploy id: **$FULL_DEPLOY_ID2** ..."
            fi
          else
            echo "OKD_URL=https://okd-dev.hbp.eu:443" >> $GITHUB_ENV
            echo "OKD_SECRET=${{ secrets.OKD_DEV_SECRET }}" >> $GITHUB_ENV
            echo "OKD_PROJECT=interactive-atlas-viewer" >> $GITHUB_ENV
            echo "ROUTE_HOST=siibra-explorer.apps-dev.hbp.eu" >> $GITHUB_ENV
            echo "BUILD_TEXT=$BRANCH_NAME" >> $GITHUB_ENV
            FULL_DEPLOY_ID=${{ env.OC_TEMPLATE_NAME }}-$DEPLOY_ID
            echo "FULL_DEPLOY_ID=$FULL_DEPLOY_ID" >> $GITHUB_ENV
            echo "Deploy on **dev** cluster ..."
            echo "Deploy id: **${FULL_DEPLOY_ID}** ..."
          fi
      - name: 'Login via oc cli & deploy'
        run: |
          oc login $OKD_URL --token=$OKD_SECRET
          oc project $OKD_PROJECT
          
          ROUTE_PATH=/$DEPLOY_ID
          echo "ROUTE_PATH=$ROUTE_PATH" >> $GITHUB_ENV

          echo "Working branch name: $BRANCH_NAME, deploy_id: $DEPLOY_ID"
          echo "full deploy id: $FULL_DEPLOY_ID, secondary deploy id: $FULL_DEPLOY_ID2"

          # check if the deploy already exist

          if oc get dc $FULL_DEPLOY_ID; then
            # trigger redeploy if deployconfig exists already
            echo "dc $FULL_DEPLOY_ID already exist, redeploy..."
            oc rollout latest dc/$FULL_DEPLOY_ID
          else 
            # create new app if deployconfig does not yet exist
            echo "dc $FULL_DEPLOY_ID does not yet exist, create new app..."
            oc new-app --template ${{ env.OC_TEMPLATE_NAME }} \
              -p BRANCH_NAME=$BRANCH_NAME \
              -p DEPLOY_ID=$DEPLOY_ID \
              -p ROUTE_HOST=$ROUTE_HOST \
              -p ROUTE_PATH=$ROUTE_PATH \
              -p BUILD_TEXT=$BUILD_TEXT
          fi

          if [ ! -z "$FULL_DEPLOY_ID2" ]
          then
            echo "FULL_DEPLOY_ID2 is defined, trying to redeploy $FULL_DEPLOY_ID2 ..."
            oc rollout latest dc/$FULL_DEPLOY_ID2
          fi
          
      - name: 'Update status badge'
        if: success()
        run: |

          DEPLOY_URL=https://$ROUTE_HOST$ROUTE_PATH
          curl -v \
            -X POST \
            -H "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
            -H 'accept: application/vnd.github.v3+json' \
            ${GITHUB_API_ROOT}/statuses/${GITHUB_SHA} \
            -d '{
              "target_url":"'$DEPLOY_URL'",
              "name": "Deployed at OKD",
              "description": "Deployed at OKD",
              "context": "[ebrains-okd-deploy] Deployed at OKD",
              "state": "success"
            }'
