name: test and deploy
on: [push]

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        python-version: ['3.10']
        poetry-version: [1.1.14]
        node: [18]
        os: [ubuntu-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3 # get source

      # PYTHON
      - name: Install Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      # PYTHON dependency management
      - name: Install Poetry ${{ matrix.poetry-version }}
        uses: abatilo/actions-poetry@v2.1.0
        with:
          poetry-version: ${{ matrix.poetry-version }}

      # PYTHON install dependencies
      - name: Install Python Dependencies
        run: poetry install

      # PYTHON for authentication when testing
      - name: Set up Cloud SDK 
        uses: google-github-actions/auth@v0.7.3
        with:
          credentials_json: '${{ secrets.GCP_SA_KEY }}'
          export_environment_variables: true
          create_credentials_file: true

      # PYTHON run unit tests
      - name: Run Python Tests
        run: poetry run python -m unittest discover -s tests

      # JS setup for testing
      - name: Install Node ${{ matrix.node }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node }}

      # JS install from lock.json
      - name: Install Node Packages
        run: npm ci
      
      # JS build for checking errors
      - name: Compile Front-end
        run: npm run build --if-present

      # JS tests
      # - name: Run JavaScript Tests
      #   run: npm test

  documentation:
    runs-on: ubuntu-latest
    needs: build # for ignoring bad builds
    if: github.event_name == 'push' && github.ref == 'refs/heads/master'
    steps:
      - uses: actions/checkout@v3 # get source

      # PYTHON
      - name: Install Python 3.10
        uses: actions/setup-python@v2
        with:
          python-version: '3.10'

      # PYTHON for dependency export only, not installing
      - name: Install Poetry 1.1.14
        uses: abatilo/actions-poetry@v2.1.0
        with:
          poetry-version: 1.1.14

      # PYTHON install dependencies
      - name: Install Python Dependencies
        run: poetry install

  #     # JS setup for jsdoc
  #     - name: Install Node 18
  #       uses: actions/setup-node@v2
  #       with:
  #         node-version: 18

  #     # JS setup for jsdoc
  #     - name: Install jsdoc
  #       run: npm install jsdoc

  #     # JS setup for jsdoc
  #     - name: Add node_modules/.bin to PATH
  #       run: echo "${GITHUB_WORKSPACE}/node_modules/.bin" >> $GITHUB_PATH

      # DEPLOY for setting up cloud API
      - name: Set up Cloud SDK 
        uses: google-github-actions/auth@v0.7.3
        with:
          credentials_json: '${{ secrets.GCP_SA_KEY }}'
          export_environment_variables: true
          create_credentials_file: true

      - name: Generate Documentation
        run: poetry run sphinx-build docs public -b html

      - name: Write CNAME
        run: echo docs.mixonomer.sarsoo.xyz > ./public/CNAME

      - name: Deploy To Pages
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./public

  deploy:
    runs-on: ubuntu-latest
    needs: build # for ignoring bad builds
    if: github.event_name == 'push' && github.ref == 'refs/heads/master'
    steps:
      - uses: actions/checkout@v3 # get source

      # PYTHON (pinned to 3.9 for gcloud attribute mapping error)
      - name: Install Python 3.9
        uses: actions/setup-python@v2
        with:
          python-version: '3.9'

      # PYTHON for dependency export only, not installing
      - name: Install Poetry 1.1.14
        uses: abatilo/actions-poetry@v2.1.0
        with:
          poetry-version: 1.1.14

      # PYTHON Export Poetry dependencies as requirements.txt
      - name: Export Poetry Dependencies
        run: python admin.py pydepend
      
      # JS setup
      - name: Install Node 18
        uses: actions/setup-node@v2
        with:
          node-version: 18

      # JS install from lock.json 
      - name: Install Node Packages
        run: npm ci

      # JS will be built again, for flagging errors
      - name: Compile Front-end
        run: npm run build --if-present

      # JS for compiling scss
      - name: Compile Sass
        uses: gha-utilities/sass-build@v0.3.5
        with:
          source: src/scss/style.scss
          destination: build/style.css

      # DEPLOY for setting up cloud API
      - name: Set up Cloud SDK 
        uses: google-github-actions/auth@v0.7.3
        with:
          credentials_json: '${{ secrets.GCP_SA_KEY }}'
          export_environment_variables: true
          create_credentials_file: true

      # DEPLOY set project
      - name: Set GCP Project
        run: python admin.py set_project

      # DEPLOY domain routes
      - name: Deploy dispatch.yaml
        run: gcloud app deploy dispatch.yaml --quiet

      # DEPLOY app engine service, -nb for skipping compile
      - name: Deploy App Engine Service
        run: python admin.py app -nb

      ### MAIN FUNCTIONS

      # DEPLOY update_tag function
      - name: Deploy update_tag Function
        run: python admin.py tag

      # DEPLOY run_user_playlist function
      - name: Deploy run_user_playlist Function
        run: python admin.py playlist

      ### CRON FUNCTIONS

      # DEPLOY run_all_playlists function
      - name: Deploy run_all_playlists Function
        run: python admin.py playlist_cron

      # DEPLOY run_all_playlist_stats function
      - name: Deploy run_all_playlist_stats Function
        run: python admin.py playlist_stats_cron

      # DEPLOY run_all_tags function
      - name: Deploy run_all_tags Function
        run: python admin.py tags_cron