name: 'Build'
on: ['push', 'pull_request', 'workflow_dispatch', 'release']
jobs:
  build:
    runs-on: ubuntu-18.04
    if: github.repository == 'nabeelio/phpvms'
    strategy:
      fail-fast: true
      matrix:
        php-versions: ['7.3', '7.4']
    name: PHP ${{ matrix.php-versions }}
    env:
      extensions: intl, pcov, mbstring
      key: cache-v1
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    # Configure Caching
    - name: Setup cache environment
      id: cache-env
      uses: shivammathur/cache-extensions@v1
      with:
        php-version: ${{ matrix.php-versions }}
        extensions: ${{ env.extensions }}
        key: ${{ env.key }}

    - name: Cache extensions
      uses: actions/cache@v1
      with:
        path: ${{ steps.cache-env.outputs.dir }}
        key: ${{ steps.cache-env.outputs.key }}
        restore-keys: ${{ steps.cache-env.outputs.key }}

    - name: Get composer cache directory
      id: composer-cache
      run: echo "::set-output name=dir::$(composer config cache-files-dir)"

    - name: Cache dependencies
      uses: actions/cache@v2
      with:
        path: ${{ steps.composer-cache.outputs.dir }}
        key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
        restore-keys: ${{ runner.os }}-composer-

    # Configure PHP
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: ${{ matrix.php-versions }}
        extensions: ${{ env.extensions }}
        ini-values: post_max_size=256M, short_open_tag=On
        coverage: xdebug
        tools: php-cs-fixer, phpunit

    - name: Shutdown Ubuntu MySQL
      run: sudo service mysql stop

    - name: Install MariaDB
      uses: getong/mariadb-action@v1.1
      with:
        character set server: 'utf8'
        collation server: 'utf8_general_ci'
        mysql database: 'phpvms'
        mysql root password: ''
        mysql user: ''
        mysql password: ''

    - name: Configure Environment
      run: |
        php --version
        mysql --version
        # Downgrade composer version to 1.x
        composer install --dev --no-interaction --verbose
        cp .github/scripts/env.php env.php
        cp .github/scripts/phpunit.xml phpunit.xml
        php artisan database:create --reset
        php artisan migrate:refresh --seed

    - name: Run Tests
      run: |
        vendor/bin/php-cs-fixer fix --config=.php_cs -v --dry-run --diff --using-cache=no
        vendor/bin/phpunit --debug --verbose

  # This runs after all of the tests, run have run. Creates a cleaned up version of the
  # distro, and then creates the artifact to push up to S3 or wherever
  artifacts:
    name: 'Create dev build'
    needs: build
    runs-on: 'ubuntu-18.04'
    if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev'
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.4'

      - uses: olegtarasov/get-tag@v2.1
        id: tagName

      # Configure Caching
      - name: Get composer cache directory
        id: composer-cache
        run: echo "::set-output name=dir::$(composer config cache-files-dir)"

      - name: Cache dependencies
        uses: actions/cache@v2
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-

        # Dependencies
      - name: 'Install Release Dependencies'
        run: |
          rm -rf vendor
          sudo npm i tar-to-zip -g
          composer install --no-dev --prefer-dist --no-interaction --verbose
          sudo chmod +x ./.github/scripts/*

      - name: Get version
        run: .github/scripts/version.sh

      - name: Build Distro
        run: .github/scripts/build.sh

      - name: Upload S3
        uses: shallwefootball/s3-upload-action@v1.1.3
        with:
          aws_key_id: ${{ secrets.S3_BUILD_ARTIFACTS_ACCESS_KEY_ID }}
          aws_secret_access_key: ${{ secrets.S3_BUILD_ARTIFACTS_SECRET_ACCESS_KEY}}
          aws_bucket: ${{ secrets.S3_BUCKET_NAME }}
          source_dir: 'dist'
          destination_dir: ''

      - name: Discord notification
        env:
          DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
        uses: Ilshidur/action-discord@0.3.0
        with:
          # DISCORD_MSG is defined in versions.sh
          args: '{{ DISCORD_MSG }}'

  # This runs after all of the tests, run have run. Creates a cleaned up version of the
  # distro, and then creates the artifact to push up to S3 or wherever
   # https://github.com/actions/create-release
  release:
    name: 'Create Release'
    needs: build
    runs-on: 'ubuntu-18.04'
    if: startsWith(github.ref, 'refs/tags/')
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.4'

      - uses: olegtarasov/get-tag@v2.1
        id: tagName

      # Configure Caching
      - name: Get composer cache directory
        id: composer-cache
        run: echo "::set-output name=dir::$(composer config cache-files-dir)"

      - name: Cache dependencies
        uses: actions/cache@v2
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-

        # Dependencies
      - name: 'Install Release Dependencies'
        run: |
          rm -rf vendor
          sudo npm i tar-to-zip -g
          composer install --no-dev --prefer-dist --no-interaction --verbose
          sudo chmod +x ./.github/scripts/*

      - name: Get version
        run: .github/scripts/version.sh

      - name: Build Distro
        run: .github/scripts/build.sh

      - name: Upload S3
        uses: shallwefootball/s3-upload-action@v1.1.3
        with:
          aws_key_id: ${{ secrets.S3_BUILD_ARTIFACTS_ACCESS_KEY_ID }}
          aws_secret_access_key: ${{ secrets.S3_BUILD_ARTIFACTS_SECRET_ACCESS_KEY}}
          aws_bucket: ${{ secrets.S3_BUCKET_NAME }}
          source_dir: 'dist'
          destination_dir: ''

      - name: Checkout code
        uses: actions/checkout@v2

      - name: Get version
        run: .github/scripts/version.sh

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          draft: true
          prerelease: false

      # Upload the tar file to the release
      - name: Upload Tar Asset
        id: upload-tar-asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: dist/{{TAR_NAME}}
          asset_name: '{{ TAR_NAME }}'
          asset_content_type: application/gzip

      # upload the zip file to the release
      - name: Upload Zip Asset
        id: upload-zip-asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: dist/{{ZIP_NAME}}
          asset_name: '{{ ZIP_NAME }}'
          asset_content_type: application/zip

      - name: Discord notification
        env:
          DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
        uses: Ilshidur/action-discord@0.3.0
        with:
          # DISCORD_MSG is defined in versions.sh
          args: '{{ DISCORD_MSG }}'
