name: deploy

on:
  push:
    tags: ["*"]

jobs:
  test:
    runs-on: ubuntu-latest
    env:
      VROBBLER_DATABASE_URL: sqlite:///test.db
      VROBBLER_USDA_API_KEY: ${{ vars.VROBBLER_USDA_API_KEY }}

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

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Cache pip/poetry
        uses: actions/cache@v4
        with:
          path: |
            ~/.cache/pip
            ~/.cache/pypoetry
          key: ${{ runner.os }}-py311-${{ hashFiles('**/poetry.lock') }}
          restore-keys: |
            ${{ runner.os }}-py311-

      - name: Install Poetry
        run: |
          python -m pip install --upgrade pip
          pip install poetry

      - name: Install deps
        run: |
          cp vrobbler.conf.test vrobbler.conf
          poetry install --with test

      - name: Pytest with coverage
        run: |
          poetry run pytest -n 5 --cov-report term:skip-covered --cov=vrobbler tests

      - name: Notify success (ntfy)
        if: success()
        run: |
          curl -fsS \
            -H "Title: vrobbler CI success" \
            -H "Priority: low" \
            -H "Tags: success,vrobbler" \
            -H "Actions: view, Changes, ${{ gitea.server_url }}/${{ gitea.repository }}/commit/${{ gitea.sha }}; view, Build, ${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}" \
            -d "✅ Build succeeded: ${{ gitea.repository }} @ ${{ gitea.sha }}" \
            https://ntfy.unbl.ink/drone

      - name: Notify failure (ntfy)
        if: failure()
        run: |
          curl -fsS \
            -H "Title: vrobbler CI failure" \
            -H "Priority: high" \
            -H "Tags: failure,vrobbler" \
            -H "Actions: view, Changes, ${{ gitea.server_url }}/${{ gitea.repository }}/commit/${{ gitea.sha }}; view, Build, ${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}" \
            -d "❌ Build failed: ${{ gitea.repository }} @ ${{ gitea.sha }}" \
            https://ntfy.unbl.ink/drone

  build-and-deploy:
    needs: [test]
    runs-on: ubuntu-latest

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

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Install Poetry
        run: |
          python -m pip install --upgrade pip
          pip install poetry

      - name: Write commit hash to build file
        run: |
          mkdir -p build_meta
          echo "${{ gitea.sha }}" | cut -c1-8 > build_meta/commit.txt

      - name: Build package with commit info
        run: |
          echo "commit = '$(echo ${{ gitea.sha }} | cut -c1-8)'" > vrobbler/_commit.py
          poetry build
          git checkout vrobbler/_commit.py

      - name: Clean old wheels from server
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: vrobbler.service
          username: root
          key: ${{ secrets.JAIL_KEY }}
          script: |
            rm -f /var/lib/vrobbler/dist/*.whl

      - name: Copy wheel to server and deploy
        uses: appleboy/scp-action@v1.0.0
        with:
          host: vrobbler.service
          username: root
          key: ${{ secrets.JAIL_KEY }}
          source: "dist/*.whl"
          target: "/var/lib/vrobbler"

      - name: Install wheel and restart services
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: vrobbler.service
          username: root
          key: ${{ secrets.JAIL_KEY }}
          command_timeout: 2m
          script: |
            set -e
            mkdir -p /var/lib/vrobbler
            echo "${{ gitea.sha }}" | cut -c1-8 > /var/lib/vrobbler/commit.txt
            pip uninstall -y vrobbler
            pip install /var/lib/vrobbler/dist/*.whl
            rm -f /var/lib/vrobbler/dist/*.whl
            python3 -c "import vrobbler; print(f'vrobbler {vrobbler.__version__} installed OK')"
            vrobbler migrate
            vrobbler collectstatic --noinput
            immortalctl restart vrobbler-celery && immortalctl restart vrobbler-celerybeat && immortalctl restart vrobbler

      - name: Notify deploy success (ntfy)
        if: success()
        run: |
          curl -fsS \
            -H "Title: vrobbler deploy success" \
            -H "Priority: low" \
            -H "Tags: success,vrobbler,deploy" \
            -H "Actions: view, View changes, ${{ gitea.server_url }}/${{ gitea.repository }}/commit/${{ gitea.sha }}; view, View build, ${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}" \
            -d "🚀 Deploy succeeded: ${{ gitea.ref_name }} (${{ gitea.sha }})" \
            https://ntfy.unbl.ink/drone

      - name: Notify deploy failure (ntfy)
        if: failure()
        run: |
          curl -fsS \
            -H "Title: vrobbler deploy failure" \
            -H "Priority: high" \
            -H "Tags: failure,vrobbler,deploy" \
            -H "Actions: view, View changes, ${{ gitea.server_url }}/${{ gitea.repository }}/commit/${{ gitea.sha }}; view, View build, ${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}" \
            -d "💥 Deploy failed: ${{ gitea.ref_name }} (${{ gitea.sha }})" \
            https://ntfy.unbl.ink/drone
