name: Build & Deploy (Nix)

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build-and-deploy:
    strategy:
      fail-fast: false
      max-parallel: 1
      matrix:
        service: [api, ml-service, web]
    runs-on: ubuntu-latest

    steps:
      - name: Check out repository
        run: |
          git clone https://git.imrnes.team/MythEclipse/zeavis-edu.git .
          git checkout ${{ github.sha }}

      - name: Build & Deploy ${{ matrix.service }}
        env:
          VPS_HOST: ${{ secrets.VPS_HOST }}
          VPS_USER: ${{ secrets.VPS_USER }}
          VPS_SSH_KEY: ${{ secrets.VPS_SSH_KEY }}
        run: |
          set -eu

          # --- Install Nix & Build ---
          curl -fsSL https://install.determinate.systems/nix \
            | sh -s -- install linux --no-confirm --init none 2>&1

          mkdir -p /etc/nix
          echo "experimental-features = nix-command flakes" >> /etc/nix/nix.conf

          . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh

          echo "=== Building: zeavis-${{ matrix.service }} ==="
          STORE_PATH=$(nix build .#${{ matrix.service }} --impure --option sandbox false --no-link --print-out-paths | tail -1)
          echo "=== Store path: $STORE_PATH"

          # --- Deploy ---
          key_file=$(mktemp /tmp/deploy-key.XXXXXX)
          if printf '%s' "$VPS_SSH_KEY" | base64 -d 2>/dev/null | head -c 6 | grep -q "BEGIN"; then
            printf '%s' "$VPS_SSH_KEY" | base64 -d > "$key_file"
          else
            printf '%s\n' "$VPS_SSH_KEY" > "$key_file"
          fi
          chmod 600 "$key_file"
          sed -i 's/\r$//' "$key_file"
          ssh-keygen -y -f "$key_file" >/dev/null 2>&1 || { echo "SSH key invalid"; exit 1; }

          export NIX_SSHOPTS="-i $key_file -o StrictHostKeyChecking=no"
          nix copy --to "ssh://${VPS_USER}@${VPS_HOST}" "$STORE_PATH" 2>&1

          ssh -i "$key_file" -o StrictHostKeyChecking=no "${VPS_USER}@${VPS_HOST}" "
            set -eu
            if [ -d /nix/var/nix/profiles/zeavis-${{ matrix.service }} ] && [ ! -L /nix/var/nix/profiles/zeavis-${{ matrix.service }} ]; then
              rm -rf /nix/var/nix/profiles/zeavis-${{ matrix.service }}
            fi
            nix-env --profile /nix/var/nix/profiles/zeavis-${{ matrix.service }} --set $STORE_PATH
            systemctl daemon-reload
            systemctl enable zeavis-${{ matrix.service }} 2>/dev/null || true
            systemctl restart zeavis-${{ matrix.service }}
            for i in \$(seq 1 30); do
              systemctl is-active --quiet zeavis-${{ matrix.service }} && break
              sleep 1
            done
            systemctl is-active zeavis-${{ matrix.service }} || {
              echo \"=== SERVICE FAILED — journal ===\"
              journalctl -u zeavis-${{ matrix.service }} -n 40 --no-pager
              exit 1
            }
            systemctl status zeavis-${{ matrix.service }} --no-pager 2>&1 | head -8
          " 2>&1
