name: Build & Deploy Costco Grocery List

on:
  push:
    branches: [ "main-new" ]

env:
  REGISTRY: git.nicosaya.com/nalalangan/costco-grocery-list
  # REGISTRY: grocery-app
  IMAGE_TAG: main-new

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repo
        uses: actions/checkout@v3

      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 20

      # -------------------------
      # 🔹 BACKEND TESTS
      # -------------------------
      - name: Install backend dependencies
        working-directory: backend
        run: npm ci

      - name: Run backend tests
        working-directory: backend
        run: npm test --if-present

      # -------------------------
      # 🔹 Docker Login
      # -------------------------
      - name: Docker login
        run: |
          echo "${{ secrets.REGISTRY_PASS }}" | docker login $REGISTRY \
            -u "${{ secrets.REGISTRY_USER }}" --password-stdin

      # -------------------------
      # 🔹 Build Backend Image
      # -------------------------
      - name: Build Backend Image
        run: |
          docker build \
            -t $REGISTRY/backend:${{ github.sha }} \
            -t $REGISTRY/backend:${{ env.IMAGE_TAG }} \
            -f backend/Dockerfile backend/

      - name: Push Backend Image
        run: |
          docker push $REGISTRY/backend:${{ github.sha }}
          docker push $REGISTRY/backend:${{ env.IMAGE_TAG }}

      # -------------------------
      # 🔹 Build Frontend Image
      # -------------------------
      - name: Build Frontend Image
        run: |
          docker build \
            -t $REGISTRY/frontend:${{ github.sha }} \
            -t $REGISTRY/frontend:${{ env.IMAGE_TAG }} \
            -f frontend/Dockerfile.dev frontend/

      - name: Push Frontend Image
        run: |
          docker push $REGISTRY/frontend:${{ github.sha }}
          docker push $REGISTRY/frontend:${{ env.IMAGE_TAG }} 

  verify-images:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Docker login
        run: |
          echo "${{ secrets.REGISTRY_PASS }}" | docker login $REGISTRY \
            -u "${{ secrets.REGISTRY_USER }}" --password-stdin

      - name: Verify backend image tags exist
        run: |
          docker manifest inspect $REGISTRY/backend:${{ github.sha }} >/dev/null
          docker manifest inspect $REGISTRY/backend:${{ env.IMAGE_TAG }} >/dev/null

      - name: Verify frontend image tags exist
        run: |
          docker manifest inspect $REGISTRY/frontend:${{ github.sha }} >/dev/null
          docker manifest inspect $REGISTRY/frontend:${{ env.IMAGE_TAG }} >/dev/null

  deploy:
    needs: verify-images
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repo
        uses: actions/checkout@v3

      - name: Install SSH key
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -H "${{ secrets.DEPLOY_HOST }}" >> ~/.ssh/known_hosts

      # ---------------------------------------------------------
      # 1. Upload docker-compose.yml to the production directory
      # ---------------------------------------------------------
      - name: Upload docker-compose.yml
        run: |
          ssh ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} "mkdir -p /opt/costco-app-new"
          scp docker-compose.new.yml \
            ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:/opt/costco-app-new/docker-compose.yml

      # ---------------------------------------------------------
      # 2. Deploy using the uploaded compose file
      # ---------------------------------------------------------
      - name: Deploy via SSH
        run: |
          ssh ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} << 'EOF'
          cd /opt/costco-app-new
          docker compose pull
          docker compose up -d --remove-orphans
          docker image prune -f
          EOF

  notify:
    needs: deploy
    runs-on: ubuntu-latest
    if: always()

    steps:          
      - name: Notify ntfy
        run: |
          STATUS="${{ needs.deploy.result }}"
          echo "Deployment job finished with status: $STATUS"

          if [ "$STATUS" = "success" ]; then
            MSG="🚀 Grocery App Deployment succeeded: $IMAGE_NAME:${{ github.sha }}"
          else
            MSG="❌ Grocery App Deployment FAILED: $IMAGE_NAME:${{ github.sha }}"
          fi

          curl -d "$MSG" \
              https://ntfy.nicosaya.com/gitea

        