stages:
  - deploy

variables:
  APP_NAME: "slop.unturf.com"
  APP_DIR: "/opt/${APP_NAME}"
  VENV_DIR: "${APP_DIR}/venv"
  CADDYFILE_DIR: "/etc/caddy"
  CADDY_SNIPPETS_DIR: "/etc/caddy/caddy_snippets"

deploy:
  stage: deploy
  tags:
    - master.unturf.com
  only:
    - main  # Deploy only from the 'main' branch
  script:
    # Step 1: Define variables with substitutions
    - |
      SERVICE_NAME="uwsgi-${APP_NAME//./-}.service"  # Replace dots with dashes
      UWSGI_SOCKET="${APP_DIR}/uwsgi.sock"           # Place socket in app directory

    # Step 2: Synchronize the code to the application directory
    - |
      if [ ! -d "${APP_DIR}" ]; then
        mkdir -p "${APP_DIR}"
      fi
      rsync -a --exclude=data/ --exclude=venv/ --delete "${CI_PROJECT_DIR}/" "${APP_DIR}/"

    # Step 3: Set up Python virtual environment and install dependencies
    - |
      if [ ! -d "${VENV_DIR}" ]; then
        python3 -m venv "${VENV_DIR}"
      fi
      source "${VENV_DIR}/bin/activate"
      pip install --upgrade pip
      pip install -r "${APP_DIR}/requirements.txt"

    # Step 4: Install uWSGI in virtual environment
    - |
      source "${VENV_DIR}/bin/activate"
      pip install uwsgi

    # Step 5: Create or update the systemd user service file for uWSGI
    - |
      mkdir -p ~/.config/systemd/user/

      # Set the MODULE for slop_with_models.py
      MODULE="slop_with_models:app"

      cat > ~/.config/systemd/user/${SERVICE_NAME} <<EOF
      [Unit]
      Description=uWSGI instance to serve ${APP_NAME}
      After=network.target

      [Service]
      WorkingDirectory=${APP_DIR}
      Environment="PATH=${VENV_DIR}/bin"
      # Pass environment variables for model endpoints
      Environment="MODEL_ENDPOINT_1=https://hermes.ai.unturf.com/v1"
      Environment="MODEL_ENDPOINT_2=https://node2.naptha.ai/inference"
      Environment="MODEL_ENDPOINT_3=https://node3.naptha.ai/inference"
      # Add API keys if needed (e.g., from GitLab variables)
      Environment="MODEL_API_KEY_1=${MODEL_API_KEY_1:-not-needed}"
      Environment="MODEL_API_KEY_2=${MODEL_API_KEY_2:-not-needed}"
      Environment="MODEL_API_KEY_3=${MODEL_API_KEY_3:-not-needed}"
      ExecStart=${VENV_DIR}/bin/uwsgi \\
        --master \\
        --enable-threads \\
        --processes 4 \\
        --http-socket ${UWSGI_SOCKET} \\
        --chmod-socket=660 \\
        --chown-socket=gitlab-runner:caddy \\
        --vacuum \\
        --die-on-term \\
        --chdir ${APP_DIR} \\
        --logto2 ${APP_DIR}/uwsgi.log \\
        --module ${MODULE}

      Restart=always
      KillSignal=SIGQUIT
      Type=notify
      NotifyAccess=all

      [Install]
      WantedBy=default.target
      EOF

    # Step 6: Reload systemd user daemon and restart the uWSGI service
    - systemctl --user daemon-reload
    - systemctl --user restart ${SERVICE_NAME}
    - systemctl --user enable ${SERVICE_NAME}

    # Step 7: Handle Caddy configurations
    - |
      mkdir -p "${CADDY_SNIPPETS_DIR}"
      cat > "${CADDY_SNIPPETS_DIR}/${APP_NAME}.caddy" <<EOF
      ${APP_NAME} {
          encode gzip
          tls {
              on_demand
          }
          handle {
              reverse_proxy unix//${UWSGI_SOCKET}
          }
      }
      EOF

      # Concatenate all snippets into the main Caddyfile
      echo '# Main Caddyfile - concatenated snippets' > "${CADDYFILE_DIR}/Caddyfile"
      cat "${CADDY_SNIPPETS_DIR}"/*.caddy >> "${CADDYFILE_DIR}/Caddyfile"

      # Validate the Caddyfile
      caddy validate --config "${CADDYFILE_DIR}/Caddyfile"

    # Step 8: Reload Caddy service
    - sudo /bin/systemctl restart caddy.service

    # Deployment completed
    - echo "Deployment completed successfully."