name: Validate Blueprints Structure and Meta

on:
  pull_request:
    branches:
      - main
  push:
    branches:
      - main

jobs:
  validate:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Validate blueprint folders and files
        run: |
          echo "🔍 Validating blueprints folder structure..."

          ERROR=0

          # Loop through each blueprint folder
          for dir in blueprints/*; do
            if [ -d "$dir" ]; then
              TEMPLATE_NAME=$(basename "$dir")

              COMPOSE_FILE="$dir/docker-compose.yml"
              TEMPLATE_FILE="$dir/template.toml"

              if [ ! -f "$COMPOSE_FILE" ]; then
                echo "❌ Missing docker-compose.yml in $TEMPLATE_NAME"
                ERROR=1
              fi

              if [ ! -f "$TEMPLATE_FILE" ]; then
                echo "❌ Missing template.toml in $TEMPLATE_NAME"
                ERROR=1
              fi
            fi
          done

          if [ $ERROR -eq 1 ]; then
            echo "❌ Blueprint folder validation failed."
            exit 1
          else
            echo "✅ Blueprint folders validated successfully."
          fi

      - name: Validate meta.json matches blueprint folders and logo files
        run: |
          echo "🔍 Validating meta.json against blueprint folders and logos..."

          ERROR=0

          # Read all blueprint folder names into an array
          FOLDERS=($(ls -1 blueprints))

          # Extract ids and logos from meta.json
          IDS_AND_LOGOS=$(jq -c '.[] | {id, logo}' meta.json)

          # Validate each id in meta.json exists as a folder
          for item in $IDS_AND_LOGOS; do
            ID=$(echo "$item" | jq -r '.id')
            LOGO=$(echo "$item" | jq -r '.logo')

            # Check if folder exists
            if [ ! -d "blueprints/$ID" ]; then
              echo "❌ meta.json id \"$ID\" does not have a matching folder in blueprints/"
              ERROR=1
              continue
            fi

            # Check if logo file exists inside its folder
            if [ ! -f "blueprints/$ID/$LOGO" ]; then
              echo "❌ Logo \"$LOGO\" defined for \"$ID\" does not exist in blueprints/$ID/"
              ERROR=1
            fi
          done

          # Validate each folder has a matching id in meta.json
          META_IDS=$(jq -r '.[].id' meta.json)
          for FOLDER in "${FOLDERS[@]}"; do
            FOUND=0
            for ID in $META_IDS; do
              if [ "$FOLDER" == "$ID" ]; then
                FOUND=1
                break
              fi
            done

            if [ "$FOUND" -eq 0 ]; then
              echo "❌ Folder \"$FOLDER\" has no matching id in meta.json"
              ERROR=1
            fi
          done

          if [ $ERROR -eq 1 ]; then
            echo "❌ meta.json validation failed."
            exit 1
          else
            echo "✅ meta.json validated successfully."
          fi
