---

name: Build, Unit Test, and Push to ECR
on:
  push:
    branches:
      - '**'  # matches every branch
      - '!master'  # master build is not used by harness deployment workflow.
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'
      - '[0-9]+.[0-9]+.[0-9]+'

jobs:
  Init:
    runs-on: ubuntu-latest
    outputs:
      ecr-repo-name: ${{ steps.create-ecr.outputs.ecr-repo-name }}
      ecr-repo-name-smoketests: ${{ steps.create-ecr-smoketests.outputs.ecr-repo-name }}
    steps:
      - uses: actions/setup-node@v5
        with:
          node-version: 22.11.0
      - uses: actions/checkout@v5
      - uses: aws-actions/configure-aws-credentials@v5
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_ECR }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_ECR }}
          aws-region: us-east-1
      - id: create-ecr
        uses: ./.github/actions/create-ecr
        with:
          repo: plutotv/service-dal
      - id: create-ecr-smoketests
        uses: ./.github/actions/create-ecr
        with:
          repo: service-dal-smoketests
      - uses: ./.github/actions/setup-ssh
        with:
          key: ${{ secrets.PLUTO_DEPLOY_SSH_KEY }}

  Build:
    runs-on: ubuntu-latest
    needs: Init
    steps:
      - uses: actions/setup-node@v5
        with:
          node-version: 22.11.0
      - uses: actions/checkout@v5
      - uses: ./.github/actions/setup-ssh
        with:
          key: ${{ secrets.PLUTO_DEPLOY_SSH_KEY }}
      - uses: aws-actions/configure-aws-credentials@v5
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_ECR }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_ECR }}
          aws-region: us-east-1

      - name: Login to ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: NPM Configure
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: |
          echo '@pluto-tv:registry=https://npm.pkg.github.com/' > "$HOME/.npmrc"
          echo "//npm.pkg.github.com/:_authToken=${NPM_TOKEN}" >> "$HOME/.npmrc"
          pwd

      - name: Build, unit test, tag, and push image to Amazon ECR
        env:
          ECR_REPOSITORY: ${{ github.repository }}
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          COMMIT_SHA: ${{ github.sha }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
          SEALIGHTS_API_KEY: ${{ secrets.SEALIGHTS_API_KEY }}
        run: |
          env
          SERVICE_NAME=$(echo $ECR_REPOSITORY | sed -e 's/Pluto-tv\///g')
          ECR_REPOSITORY=plutotv/$SERVICE_NAME
          IMAGE_TAG=$(echo $GITHUB_REF_NAME | sed -e 's/\//_/g')_run${GITHUB_RUN_NUMBER}_$(git rev-parse --short=7 HEAD)
          DOCKER_BUILDKIT=1 docker build -f ./Dockerfile -t $ECR_REPOSITORY --progress=plain \
            --secret id=npmrc,src=$HOME/.npmrc --build-arg Sealights_API_Key=${SEALIGHTS_API_KEY} --build-arg GITHUB_REF=${GITHUB_REF} \
            --build-arg GITHUB_REPOSITORY=${GITHUB_REPOSITORY} --build-arg GITHUB_SHA=${GITHUB_SHA} \
            --build-arg GITHUB_RUN_ID=${GITHUB_RUN_ID} .
          docker compose -f docker-compose.test.yml run $SERVICE_NAME test:sealights

          CONTAINER_ID=$(docker compose -f docker-compose.test.yml ps -qa $SERVICE_NAME)
          docker cp ${CONTAINER_ID}:/src/coverage coverage

          docker tag $ECR_REPOSITORY:latest $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

      - name: Build, tag, and push Smoketest image
        env:
          ECR_REPOSITORY: service-dal-smoketests
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          COMMIT_SHA: ${{ github.sha }}
        run: |
          env
          IMAGE_TAG=$(echo $GITHUB_REF_NAME | sed -e 's/\//_/g')_run${GITHUB_RUN_NUMBER}_$(git rev-parse --short=7 HEAD)
          DOCKER_BUILDKIT=1 docker build -f ./Dockerfile.smoketests --build-arg Sealights_API_Key=${SEALIGHTS_API_KEY} -t $ECR_REPOSITORY --progress=plain .
          docker tag $ECR_REPOSITORY:latest $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG

      - name: Logout of Amazon ECR
        if: always()
        run: docker logout ${{ steps.login-ecr.outputs.registry }}

      - name: Publish SwaggerHub
        env:
          SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
        run: |
          GIT_BRANCH=$GITHUB_REF_NAME \
          GIT_COMMIT=$GITHUB_SHA \
          SERVICE_NAME=$(grep \"name\" package.json | sed 's/"name"//' | sed 's/[^a-zA-Z0-9-]//g') \
          VERSION=$(grep \"version\" package.json | sed s/[^0-9\.]//g) \
          SWAGGER_FILE=./swagger/main.swagger.json ./scripts/swaggerhub.sh
      
      - uses: actions/setup-java@v5
        with:
          distribution: 'temurin'
          java-version: '17'

      - name: Setup sonarqube
        uses: warchant/setup-sonar-scanner@v8

      - name: Run sonarqube scanner
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: sonar-scanner
          -Dsonar.token=${{ secrets.SONARQUBE_TOKEN_PARAMOUNT }}
          -Dsonar.host.url=https://sonarde.vmn.io/
          -Dsonar.links.scm=${{ github.event.repository.url }}
          -Dsonar.projectKey=${{ github.event.repository.name }}
          -Dsonar.projectName=${{ github.event.repository.name }}
          -Dsonar.language=js
