#!/bin/bash
# review and improve
. ./.env # for secrets
set -e # stop  on any error
#set -x dont echo secrets
export BRANCH="feature/ec2"
#export ROOT="/mnt/data1/swarms"
export ROOT="" # empty
export WORKSOURCE="${ROOT}/opt/swarms/api"

if [ ! -d "${ROOT}/opt/swarms/install/" ]; then
    mkdir -p "${ROOT}/opt/swarms/install"
fi

if [ ! -f "${ROOT}/opt/swarms/install/apt.txt" ]; then
    apt update
    apt install --allow-change-held-packages -y git python3-virtualenv nginx
    apt install --allow-change-held-packages -y expect
    apt install --allow-change-held-packages -y jq netcat-traditional # missing packages
    snap install aws-cli --classic
    echo 1 >"${ROOT}/opt/swarms/install/apt.txt"
fi

if [ ! -f "${ROOT}/opt/swarms/install/setup.txt" ]; then
    #rm -rf ./src/swarms # oops
    #adduser --disabled-password --comment "" swarms --home "${ROOT}/home/swarms" || echo ignore
    adduser --disabled-password --gecos "" swarms --home "${ROOT}/home/swarms"  || echo ignore
    git config --global --add safe.directory "${ROOT}/opt/swarms"
    git config --global --add safe.directory "${ROOT}/opt/swarms-memory"
    # we should have done this
    if [ ! -d "${ROOT}/opt/swarms/" ];
    then
	git clone https://github.com/jmikedupont2/swarms "${ROOT}/opt/swarms/"
    fi    
    cd "${ROOT}/opt/swarms/" || exit 1 # "we need swarms"
#    git remote add local /time/2024/05/swarms/ || git remote set-url local /time/2024/05/swarms/ 
#    git fetch local 
#    git stash
    git checkout --force  $BRANCH
    git pull 
    git log -2 --patch | head  -1000
    if [ ! -d "${ROOT}/opt/swarms-memory/" ];
    then
	git clone https://github.com/The-Swarm-Corporation/swarms-memory "${ROOT}/opt/swarms-memory"
    fi    
    # where the swarms will run
    mkdir -p "${ROOT}/var/swarms/agent_workspace/"
    mkdir -p "${ROOT}/home/swarms"
    chown -R swarms:swarms "${ROOT}/var/swarms/agent_workspace" "${ROOT}/home/swarms"    

    # now for my local setup I aslo need to do this or we have to change the systemctl home var
    #mkdir -p "/home/swarms"
    #chown -R swarms:swarms "/home/swarms"    

    # copy the run file from git
    cp "${WORKSOURCE}/boot.sh" "${ROOT}/var/swarms/agent_workspace/boot.sh"
    mkdir -p "${ROOT}/var/swarms/logs"
    chmod +x "${ROOT}/var/swarms/agent_workspace/boot.sh"
    chown -R swarms:swarms "${ROOT}/var/swarms/" "${ROOT}/home/swarms" "${ROOT}/opt/swarms"

    echo 1 >"${ROOT}/opt/swarms/install/setup.txt"
fi

if [ ! -f "${ROOT}/opt/swarms/install/boot.txt" ]; then
    # user install but do not start
    su -c "bash -e -x ${ROOT}/var/swarms/agent_workspace/boot.sh" swarms
    echo 1 >"${ROOT}/opt/swarms/install/boot.txt"
fi
    

## pull

if [ ! -f "${ROOT}/opt/swarms/install/pull.txt" ]; then
    cd "${ROOT}/opt/swarms/" || exit 1 # "we need swarms"
#    git fetch local 
#    git stash
    git checkout --force  $BRANCH
    git pull # $BRANCH
    echo 1 >"${ROOT}/opt/swarms/install/pull.txt"
fi

if [ ! -f "${ROOT}/opt/swarms/install/config.txt" ]; then
    mkdir -p "${ROOT}/var/run/swarms/secrets/"
    mkdir -p "${ROOT}/home/swarms/.cache/huggingface/hub"
    # aws ssm get-parameter     --name "swarms_openai_key" > /root/openaikey.txt
    export OPENAI_KEY=`aws ssm get-parameter     --name "swarms_openai_key" | jq .Parameter.Value -r `
    echo "OPENAI_KEY=${OPENAI_KEY}" > "${ROOT}/var/run/swarms/secrets/env"
    
    ## append new homedir
    echo "HF_HOME=${ROOT}/home/swarms/.cache/huggingface/hub" >> "${ROOT}/var/run/swarms/secrets/env"
    echo "HOME=${ROOT}/home/swarms" >> "${ROOT}/var/run/swarms/secrets/env"
    # attempt to move the workspace
    echo 'WORKSPACE_DIR=${STATE_DIRECTORY}' >> "${ROOT}/var/run/swarms/secrets/env"
    #EnvironmentFile=ROOT/var/run/swarms/secrets/env
    #ExecStart=ROOT/var/run/uvicorn/env/bin/uvicorn \
	#	--uds ROOT/run/uvicorn/uvicorn-swarms-api.sock \
    echo 1 >"${ROOT}/opt/swarms/install/config.txt"    
fi

if [ ! -f "${ROOT}/opt/swarms/install/nginx.txt" ]; then
    mkdir -p ${ROOT}/var/log/nginx/swarms/
fi


# create sock
mkdir -p ${ROOT}/run/uvicorn/
chown -R swarms:swarms ${ROOT}/run/uvicorn

# reconfigure
# now we setup the service and  replace root in the files
#echo  cat "${WORKSOURCE}/nginx/site.conf" \| sed -e "s!ROOT!${ROOT}!g" 
sed -e "s!ROOT!${ROOT}!g" > /etc/nginx/sites-enabled/default < "${WORKSOURCE}/nginx/site.conf"
#cat /etc/nginx/sites-enabled/default

# ROOT/var/run/swarms/uvicorn-swarms-api.sock;
#    access_log ROOT/var/log/nginx/swarms/access.log;
#    error_log ROOT/var/log/nginx/swarms/error.log;
#echo cat "${WORKSOURCE}/systemd/uvicorn.service" \| sed -e "s!ROOT!/${ROOT}/!g"
#cat "${WORKSOURCE}/systemd/uvicorn.service"
sed -e "s!ROOT!${ROOT}!g" > /etc/systemd/system/swarms-uvicorn.service < "${WORKSOURCE}/systemd/uvicorn.service"
grep . -h -n /etc/systemd/system/swarms-uvicorn.service
			    
# if [ -f ${ROOT}/etc/systemd/system/swarms-uvicorn.service ];
# then
#     cp ${ROOT}/etc/systemd/system/swarms-uvicorn.service /etc/systemd/system/swarms-uvicorn.service
# else
#     # allow for editing as non root
#     mkdir -p ${ROOT}/etc/systemd/system/
#     cp /etc/systemd/system/swarms-uvicorn.service ${ROOT}/etc/systemd/system/swarms-uvicorn.service      
# fi

# 
#chown -R mdupont:mdupont ${ROOT}/etc/systemd/system/
#/run/uvicorn/
# triage
chown -R swarms:swarms ${ROOT}/var/run/swarms/
# Dec 12 10:55:50 mdupont-G470 unbuffer[3921723]: OSError: [Errno 30] Read-only file system: 
#cat /etc/systemd/system/swarms-uvicorn.service

# now fix the perms
mkdir -p ${ROOT}/opt/swarms/api/agent_workspace/try_except_wrapper/
chown -R swarms:swarms ${ROOT}/opt/swarms/api/

# always reload
systemctl daemon-reload
#    systemctl start swarms-uvicorn || systemctl status swarms-uvicorn.service  && journalctl -xeu swarms-uvicorn.service
systemctl start swarms-uvicorn || journalctl -xeu swarms-uvicorn.service
# systemctl status swarms-uvicorn.service
# journalctl -xeu swarms-uvicorn.serviceo
systemctl enable swarms-uvicorn || journalctl -xeu swarms-uvicorn.service
systemctl enable nginx
systemctl start nginx

journalctl -xeu swarms-uvicorn.service | tail -200 || echo oops
systemctl status swarms-uvicorn.service || echo oops2

# now after swarms is up, we restart nginx
HOST="localhost"
PORT=5474
while ! nc -z $HOST $PORT; do
  sleep 1
  echo -n "."
done
echo "Port $PORT is now open!"

systemctl restart nginx