# yamllint disable rule:line-length
# inspired from https://github.com/Poeschl/Hassio-Addons
---
name: Builder

env:
  BUILD_ARGS: ""

on:
  workflow_call:
  push:
    branches:
      - master
    paths:
      - "**/config.*"

jobs:
  correct_path_filters:
    if: github.repository_owner == 'alexbelgium'
    runs-on: ubuntu-latest
    steps:
      - name: ↩️ Checkout
        uses: actions/checkout@v4
      - name: Update path_filters
        run: |
          # Init
          echo "Starting"

          # Go through all folders, add to filters if not existing
          for f in $( find -- * -maxdepth 0 -type d | sort -r ); do
            if [ -f "$f"/config.json ]; then
            
              # Add to file
              if ! grep "$f:" ".github/paths-filter.yml"; then
                echo "$f: $f/config.*" >> ".github/paths-filter.yml"
              fi
              
              # Identify addons with true images
              if [ "$(jq '.image' "$f/config.json")" != null ]; then
                sed -i "/$f/ s/ # Image : yes//g" ".github/paths-filter.yml"
                sed -i "/$f/ s/$/ # Image : yes/" ".github/paths-filter.yml"
              fi
            fi
          done

          # Sort yaml
          sort -t= ".github/paths-filter.yml" -o ".github/paths-filter.yml"
      - name: Commit if needed
        uses: EndBug/add-and-commit@v9
        with:
          commit: -u
          message: "GitHub bot : scripts executable"
          default_author: github_actions
  check-addon-changes:
    runs-on: ubuntu-latest
    needs: [correct_path_filters]
    outputs:
      changedAddons: ${{ steps.filter.outputs.changes }}
    steps:
      - name: ↩️ Checkout
        uses: actions/checkout@v4
      - name: 📂 Detect changed files
        uses: dorny/paths-filter@v3
        id: filter
        with:
          filters: .github/paths-filter.yml

  correct-CRLF:
    if: ${{ needs.check-addon-changes.outputs.changedAddons != '[]' }}
    needs: check-addon-changes
    uses: ./.github/workflows/weekly_crlftolf.yaml

  make-executable:
    if: ${{ needs.check-addon-changes.outputs.changedAddons != '[]' }}
    needs: [check-addon-changes, correct-CRLF]
    runs-on: ubuntu-latest
    strategy: 
      fail-fast: false
      matrix:
        addon: ${{ fromJSON(needs.check-addon-changes.outputs.changedAddons) }}
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v4
      - name: Make scripts executable
        run: |
          echo "Starting"
          git pull origin master
          git config core.filemode true
          # shellcheck disable=SC2086,SC2046
          #git update-index --chmod=+x $(find "$path" -type f -iname "*.sh")
          chmod u+x $(find "$path" -type f -iname "*.sh") || true
          #git commit -am "fixing the script permissions..."
        env: 
          path: "./${{ matrix.addon }}"
      - name: Commit if needed
        uses: EndBug/add-and-commit@v9
        with:
          commit: -u
          message: "GitHub bot : scripts executable"
          default_author: github_actions

  lint_config:
    if: ${{ needs.check-addon-changes.outputs.changedAddons != '[]' }}
    needs: check-addon-changes
    runs-on: ubuntu-latest
    strategy:
      matrix:
        addon: ${{ fromJSON(needs.check-addon-changes.outputs.changedAddons) }}
    steps:
      - name: ↩️ Checkout
        uses: actions/checkout@v4
      - name: 🔎 Run Home Assistant Add-on Lint
        uses: frenck/action-addon-linter@v2
        with:
          path: "./${{ matrix.addon }}"

  build:
    if: ${{ needs.check-addon-changes.outputs.changedAddons != '[]' }}
    needs: [check-addon-changes, make-executable, correct-CRLF]
    runs-on: ubuntu-latest
    environment: CR_PAT
    name: Build ${{ matrix.arch }} ${{ matrix.addon }} add-on
    strategy:
      matrix:
        addon: ${{ fromJSON(needs.check-addon-changes.outputs.changedAddons) }}
        arch: ["aarch64", "amd64", "armv7"]

    steps:
      - name: Check out repository
        uses: actions/checkout@v4

      - name: Resolve Symlinks
        run: |
          # Find all symlinks and replace them with the real files or directories
          find . -type l | while read -r link; do
            target="$(readlink -f "$link")"
            # Remove the symlink
            rm "$link"
            if [ -d "$target" ]; then
              cp -R "$target" "$link"
            else
              cp "$target" "$link"
            fi
          done

      - name: Get information
        id: info
        uses: home-assistant/actions/helpers/info@master
        with:
          path: "./${{ matrix.addon }}"

      - name: Check if add-on should be built
        id: check
        env:
          HEAD: "${{ github.head_ref }}"
        run: |
          # shellcheck disable=SC2157,SC2086 
          if [[ "${{ steps.info.outputs.architectures }}" =~ ${{ matrix.arch }} ]]; then
             # shellcheck disable=SC2129
             echo "build_arch=true" >> $GITHUB_OUTPUT;
             # shellcheck disable=SC2129
             echo "image=$(echo ${{ steps.info.outputs.image }} | cut -d'/' -f3)" >> $GITHUB_OUTPUT;
             if [[ -z "$HEAD" ]] && [[ "${{ github.event_name }}" == "push" ]]; then
                 # shellcheck disable=SC2129
                 echo "BUILD_ARGS=" >> $GITHUB_ENV;
             fi
           else
             echo "${{ matrix.arch }} is not a valid arch for ${{ matrix.addon }}, skipping build";
             # shellcheck disable=SC2129
             echo "build_arch=false" >> $GITHUB_OUTPUT;
          fi

      - name: Use action to check for mixed line endings (CRLF and LF)
        uses: ymwymw/check-mixed-line-endings@v2

      - name: Login to GitHub Container Registry
        if: env.BUILD_ARGS != '--test'
        uses: docker/login-action@v3.1.0
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build ${{ matrix.addon }} add-on
        id: builderstep
        if: steps.check.outputs.build_arch == 'true'
        uses: home-assistant/builder@2025.02.0
        env:
          CAS_API_KEY: ${{ secrets.CAS_API_KEY }}
        with:
          args: |
            ${{ env.BUILD_ARGS }} \
            --${{ matrix.arch }} \
            --target /data/${{ matrix.addon }} \
            --image "${{ steps.check.outputs.image }}" \
            --docker-hub "ghcr.io/${{ github.repository_owner }}" \
            --addon

  make-changelog:
    if: ${{ needs.check-addon-changes.outputs.changedAddons != '[]' }}
    needs: [check-addon-changes, build]
    runs-on: ubuntu-latest
    strategy:
      matrix:
        addon: ${{ fromJSON(needs.check-addon-changes.outputs.changedAddons) }}
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v4
      - name: Update changelog for minor versions
        run: |
          echo "Starting"
          # Git pull
          git pull || true
          cd "$path"
          # Get version
          if [ -f config.yaml ]; then
            version="$(sed -e '/version/!d' -e 's/.*version: //' config.yaml)"
          elif [ -f config.json ]; then
            version="$(sed -e '/version/!d' -e 's/.*[^"]*"\([^"]*\)"/\1/' config.json)"
            version="${version//,}"
          else
            exit 1
          fi
          # Exit if test
          if [[ "$version" == *"test"* ]]; then exit 0; fi
          # Create changelog
          touch CHANGELOG.md
          # If the version does not exist
          if ! grep -q "$version" CHANGELOG.md; then
            first_line="$(sed -n '/./p' CHANGELOG.md | head -n 1)"
            # If the first line does not start with -
            if [[ "$first_line" != "-"* ]]; then
              sed -i "1i\- Minor bugs fixed" CHANGELOG.md
            fi
            sed -i "1i\## $version ($(date '+%d-%m-%Y'))" CHANGELOG.md
            #fi
          fi
        env: 
          path: "./${{ matrix.addon }}"
      - name: Commit if needed
        uses: EndBug/add-and-commit@v9
        with:
          commit: -u
          message: "GitHub bot : changelog"
          default_author: github_actions
          fetch: --force
          push: --force
