name: CI

on:
  push:
    branches:
      - '**'
  release:
    types: [created]
  workflow_dispatch:

jobs:
  release:
    runs-on: ubuntu-latest
    container:
      image: php:8.3

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

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq

      - name: Install phive
        run: |
          wget -O phive.phar https://phar.io/releases/phive.phar
          wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
          gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
          gpg --verify phive.phar.asc phive.phar
          chmod +x phive.phar
          mv phive.phar /usr/local/bin/phive

      - name: Install phab
        run: |
          phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C

      - name: Install latest version of NCC
        run: |
          git clone https://git.n64.cc/nosial/ncc.git
          cd ncc
          make redist
          NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
          if [ -z "$NCC_DIR" ]; then
            echo "NCC build directory not found"
            exit 1
          fi
          php "$NCC_DIR/INSTALL" --auto
          cd .. && rm -rf ncc

      - name: Build project
        run: |
          ncc build --config release --build-source --log-level debug

      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: release
          path: build/release/net.nosial.tgbotlib.ncc
  release-compressed:
    runs-on: ubuntu-latest
    container:
      image: php:8.3

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

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq

      - name: Install phive
        run: |
          wget -O phive.phar https://phar.io/releases/phive.phar
          wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
          gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
          gpg --verify phive.phar.asc phive.phar
          chmod +x phive.phar
          mv phive.phar /usr/local/bin/phive

      - name: Install phab
        run: |
          phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C

      - name: Install latest version of NCC
        run: |
          git clone https://git.n64.cc/nosial/ncc.git
          cd ncc
          make redist
          NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
          if [ -z "$NCC_DIR" ]; then
            echo "NCC build directory not found"
            exit 1
          fi
          php "$NCC_DIR/INSTALL" --auto
          cd .. && rm -rf ncc

      - name: Build project
        run: |
          ncc build --config release-compressed --build-source --log-level debug

      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: release-compressed
          path: build/release/net.nosial.tgbotlib.gz.ncc
  release-executable:
    runs-on: ubuntu-latest
    container:
      image: php:8.3

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

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq

      - name: Install phive
        run: |
          wget -O phive.phar https://phar.io/releases/phive.phar
          wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
          gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
          gpg --verify phive.phar.asc phive.phar
          chmod +x phive.phar
          mv phive.phar /usr/local/bin/phive

      - name: Install phab
        run: |
          phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C

      - name: Install latest version of NCC
        run: |
          git clone https://git.n64.cc/nosial/ncc.git
          cd ncc
          make redist
          NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
          if [ -z "$NCC_DIR" ]; then
            echo "NCC build directory not found"
            exit 1
          fi
          php "$NCC_DIR/INSTALL" --auto
          cd .. && rm -rf ncc

      - name: Build project
        run: |
          ncc build --config release-executable --build-source --log-level debug

      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: release-executable
          path: build/release/TgBotLib
  release-executable-compressed:
    runs-on: ubuntu-latest
    container:
      image: php:8.3

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

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq

      - name: Install phive
        run: |
          wget -O phive.phar https://phar.io/releases/phive.phar
          wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
          gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
          gpg --verify phive.phar.asc phive.phar
          chmod +x phive.phar
          mv phive.phar /usr/local/bin/phive

      - name: Install phab
        run: |
          phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C

      - name: Install latest version of NCC
        run: |
          git clone https://git.n64.cc/nosial/ncc.git
          cd ncc
          make redist
          NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
          if [ -z "$NCC_DIR" ]; then
            echo "NCC build directory not found"
            exit 1
          fi
          php "$NCC_DIR/INSTALL" --auto
          cd .. && rm -rf ncc

      - name: Build project
        run: |
          ncc build --config release-executable-compressed --build-source --log-level debug

      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: release-executable-compressed
          path: build/release/TgBotLib_gz
  debug:
    runs-on: ubuntu-latest
    container:
      image: php:8.3

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

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq

      - name: Install phive
        run: |
          wget -O phive.phar https://phar.io/releases/phive.phar
          wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
          gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
          gpg --verify phive.phar.asc phive.phar
          chmod +x phive.phar
          mv phive.phar /usr/local/bin/phive

      - name: Install phab
        run: |
          phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C

      - name: Install latest version of NCC
        run: |
          git clone https://git.n64.cc/nosial/ncc.git
          cd ncc
          make redist
          NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
          if [ -z "$NCC_DIR" ]; then
            echo "NCC build directory not found"
            exit 1
          fi
          php "$NCC_DIR/INSTALL" --auto
          cd .. && rm -rf ncc

      - name: Build project
        run: |
          ncc build --config debug --build-source --log-level debug

      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: debug
          path: build/debug/net.nosial.tgbotlib.ncc
  debug-compressed:
    runs-on: ubuntu-latest
    container:
      image: php:8.3

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

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq

      - name: Install phive
        run: |
          wget -O phive.phar https://phar.io/releases/phive.phar
          wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
          gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
          gpg --verify phive.phar.asc phive.phar
          chmod +x phive.phar
          mv phive.phar /usr/local/bin/phive

      - name: Install phab
        run: |
          phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C

      - name: Install latest version of NCC
        run: |
          git clone https://git.n64.cc/nosial/ncc.git
          cd ncc
          make redist
          NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
          if [ -z "$NCC_DIR" ]; then
            echo "NCC build directory not found"
            exit 1
          fi
          php "$NCC_DIR/INSTALL" --auto
          cd .. && rm -rf ncc

      - name: Build project
        run: |
          ncc build --config debug-compressed --build-source --log-level debug

      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: debug-compressed
          path: build/debug/net.nosial.tgbotlib.gz.ncc


  # Checking for phpunit.xml
  check-phpunit:
    runs-on: ubuntu-latest
    outputs:
      phpunit-exists: ${{ steps.check.outputs.phpunit-exists }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Check for phpunit.xml
        id: check
        run: |
          if [ -f phpunit.xml ]; then
            echo "phpunit-exists=true" >> $GITHUB_OUTPUT
          else
            echo "phpunit-exists=false" >> $GITHUB_OUTPUT
          fi
  # Checking for phpdoc.dist.xml
  check-phpdoc:
    runs-on: ubuntu-latest
    outputs:
      phpdoc-exists: ${{ steps.check.outputs.phpdoc-exists }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Check for phpdoc.dist.xml
        id: check
        run: |
          if [ -f phpdoc.dist.xml ]; then
            echo "phpdoc-exists=true" >> $GITHUB_OUTPUT
          else
            echo "phpdoc-exists=false" >> $GITHUB_OUTPUT
          fi
  generate-phpdoc:
    needs: [release, check-phpdoc]
    runs-on: ubuntu-latest
    container:
      image: php:8.3
    if: needs.check-phpdoc.outputs.phpdoc-exists == 'true'

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

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq

      - name: Download PHPDocumentor
        run: |
          wget https://phpdoc.org/phpDocumentor.phar
          chmod +x phpDocumentor.phar

      - name: Generate PHPDoc
        run: |
          php phpDocumentor.phar -d src -t docs

      - name: Archive PHPDoc
        run: |
          zip -r docs.zip docs

      - name: Upload PHPDoc
        uses: actions/upload-artifact@v4
        with:
          name: documentation
          path: docs.zip

  test:
    needs: [release, release-compressed, release-executable, release-executable-compressed, debug, debug-compressed, check-phpunit]
    runs-on: ubuntu-latest
    container:
      image: php:8.3
    if: needs.check-phpunit.outputs.phpunit-exists == 'true'

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

      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: release
          path: release

      - name: Install dependencies
        run: |
          apt update -yqq
          apt install git libpq-dev libzip-dev zip make wget gnupg -yqq
          curl -sSLf -o /usr/local/bin/install-php-extensions https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions
          chmod +x /usr/local/bin/install-php-extensions
          install-php-extensions zip

      - name: Install phive
        run: |
          wget -O phive.phar https://phar.io/releases/phive.phar
          wget -O phive.phar.asc https://phar.io/releases/phive.phar.asc
          gpg --keyserver hkps://keys.openpgp.org --recv-keys 0x9D8A98B29B2D5D79
          gpg --verify phive.phar.asc phive.phar
          chmod +x phive.phar
          mv phive.phar /usr/local/bin/phive

      - name: Install phab
        run: |
          phive install phpab --global --trust-gpg-keys 0x2A8299CE842DD38C

      - name: Install latest version of NCC
        run: |
          git clone https://git.n64.cc/nosial/ncc.git
          cd ncc
          make redist
          NCC_DIR=$(find build/ -type d -name "ncc_*" | head -n 1)
          if [ -z "$NCC_DIR" ]; then
            echo "NCC build directory not found"
            exit 1
          fi
          php "$NCC_DIR/INSTALL" --auto
          cd .. && rm -rf ncc

      - name: Install NCC packages
        run: |
          ncc package install --package="release/net.nosial.tgbotlib.ncc" --build-source --reinstall -y --log-level debug

      - name: Export token.txt
        run: echo "${{ secrets.TELEGRAM_TEST_TOKEN }}" > tests/token.txt

      - name: Run PHPUnit tests
        run: |
          wget https://phar.phpunit.de/phpunit-11.3.phar
          php phpunit-11.3.phar --configuration phpunit.xml --log-junit reports/junit.xml --log-teamcity reports/teamcity --testdox-html reports/testdox.html --testdox-text reports/testdox.txt

      - name: Upload test reports
        uses: actions/upload-artifact@v4
        with:
          name: reports
          path: reports


  release-documentation:
    needs: generate-phpdoc
    permissions: write-all
    runs-on: ubuntu-latest
    container:
      image: php:8.3
    if: github.event_name == 'release'

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

      - name: Download documentation artifact
        uses: actions/download-artifact@v4
        with:
          name: documentation
          path: documentation

      - name: Upload documentation artifact
        uses: softprops/action-gh-release@v1
        with:
            files: |
                documentation/*
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


  release-artifacts:
    needs: [release, release-compressed, release-executable, release-executable-compressed, debug, debug-compressed]
    permissions: write-all
    runs-on: ubuntu-latest
    container:
      image: php:8.3
    if: github.event_name == 'release'

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

      - name: Download release artifact
        uses: actions/download-artifact@v4
        with:
          name: release
          path: release
      - name: Upload release artifact to release
        uses: softprops/action-gh-release@v1
        with:
            files: |
                release/*
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Download release-compressed artifact
        uses: actions/download-artifact@v4
        with:
          name: release-compressed
          path: release-compressed
      - name: Upload release-compressed artifact to release
        uses: softprops/action-gh-release@v1
        with:
            files: |
                release-compressed/*
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Download release-executable artifact
        uses: actions/download-artifact@v4
        with:
          name: release-executable
          path: release-executable
      - name: Upload release-executable artifact to release
        uses: softprops/action-gh-release@v1
        with:
            files: |
                release-executable/*
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Download release-executable-compressed artifact
        uses: actions/download-artifact@v4
        with:
          name: release-executable-compressed
          path: release-executable-compressed
      - name: Upload release-executable-compressed artifact to release
        uses: softprops/action-gh-release@v1
        with:
            files: |
                release-executable-compressed/*
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Download debug artifact
        uses: actions/download-artifact@v4
        with:
          name: debug
          path: debug
      - name: Upload debug artifact to release
        uses: softprops/action-gh-release@v1
        with:
            files: |
                debug/*
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Download debug-compressed artifact
        uses: actions/download-artifact@v4
        with:
          name: debug-compressed
          path: debug-compressed
      - name: Upload debug-compressed artifact to release
        uses: softprops/action-gh-release@v1
        with:
            files: |
                debug-compressed/*
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
