name: "Production: Deploy UI"
run-name: "Production: Deploy UI"

on:
  push:
    branches:
      - main
    paths:
      - 'ui/**'
      - '.github/workflows/deploy-ui.yml'
  workflow_dispatch:

concurrency:
  group: deploy-gemmbot
  cancel-in-progress: false

jobs:
  deploy-ui:
    runs-on: ubuntu-latest

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

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'npm'
          cache-dependency-path: ui/package-lock.json

      - name: Install dependencies
        working-directory: ui
        run: npm ci

      - name: Generate Prisma client
        working-directory: ui
        run: npx prisma generate

      - name: Build UI
        working-directory: ui
        run: npx next build

      - name: Setup SSH
        env:
          EC2_HOST: ${{ secrets.EC2_HOST }}
          EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }}
        run: |
          mkdir -p ~/.ssh
          echo "$EC2_SSH_KEY" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -H $EC2_HOST >> ~/.ssh/known_hosts

      - name: Write UI .env on EC2
        env:
          EC2_HOST: ${{ secrets.EC2_HOST }}
          EC2_USER: ${{ secrets.EC2_USER }}
          ENCRYPTION_KEY: ${{ secrets.ENCRYPTION_KEY }}
          NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
          GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
          GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }}
        run: |
          cat > /tmp/ui.env << EOF
          DATABASE_URL=file:/opt/gemmbot/data/gemmbot.db
          ENCRYPTION_KEY=${ENCRYPTION_KEY}
          NEXTAUTH_URL=https://gemmbot.gemmaanalytics.com
          NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
          GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
          GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
          BOT_ADMIN_URL=http://127.0.0.1:7900
          EOF
          sed -i 's/^          //' /tmp/ui.env
          scp -i ~/.ssh/deploy_key /tmp/ui.env $EC2_USER@$EC2_HOST:/tmp/ui.env
          ssh -i ~/.ssh/deploy_key $EC2_USER@$EC2_HOST "sudo mv /tmp/ui.env /opt/gemmbot/ui/.env && sudo chown gemmbot:gemmbot /opt/gemmbot/ui/.env && sudo chmod 640 /opt/gemmbot/ui/.env"
          rm /tmp/ui.env

      - name: Deploy UI code
        env:
          EC2_HOST: ${{ secrets.EC2_HOST }}
          EC2_USER: ${{ secrets.EC2_USER }}
        run: |
          rsync -rlvz --delete --omit-dir-times \
            -e "ssh -i ~/.ssh/deploy_key" \
            --exclude node_modules \
            --exclude .env \
            --exclude .env.local \
            ui/ $EC2_USER@$EC2_HOST:/opt/gemmbot/ui/

      - name: Install, migrate, restart
        env:
          EC2_HOST: ${{ secrets.EC2_HOST }}
          EC2_USER: ${{ secrets.EC2_USER }}
        run: |
          ssh -i ~/.ssh/deploy_key $EC2_USER@$EC2_HOST "
            echo '### Stopping services (to release DB locks) ###'
            sudo systemctl stop gemmbot || true
            sudo systemctl stop gemmbot-ui || true

            cd /opt/gemmbot/ui

            echo '### Installing dependencies ###'
            npm ci --production

            echo '### Generating Prisma client ###'
            npx prisma generate

            echo '### Symlinking Prisma client for bot ###'
            rm -rf /opt/gemmbot/bot/node_modules/.prisma
            ln -s /opt/gemmbot/ui/node_modules/.prisma /opt/gemmbot/bot/node_modules/.prisma

            echo '### Fixing data dir permissions (before migration) ###'
            sudo chown -R gemmbot:gemmbot /opt/gemmbot/data
            sudo chmod -R g+rw /opt/gemmbot/data

            echo '### Running database migrations ###'
            npx prisma migrate deploy

            echo '### Fixing data dir permissions (after migration) ###'
            sudo chown -R gemmbot:gemmbot /opt/gemmbot/data
            sudo chmod -R g+rw /opt/gemmbot/data

            echo '### Starting services ###'
            sudo systemctl start gemmbot-ui
            sudo systemctl start gemmbot

            echo '### UI deployment complete ###'
          "
