#!/bin/bash

# Colors
RESTORE='\033[0m'
RED='\033[00;31m'
GREEN='\033[00;32m'
YELLOW='\033[00;33m'
BLUE='\033[00;34m'
PURPLE='\033[00;35m'
CYAN='\033[00;36m'
LIGHTGREY='\033[00;37m'
# end colors

PID_LOCATION="/var/run/"

LOG_LOCATION="/var/log/scripts/"

CRR_TASK_QUEUE="crr-task-queue-worker"
CRR_BULK_INTIMATION_QUEUE="crr-bulk-intimation-worker"
CRR_BULK_SMS_QUEUE="crr-bulk-sms-queue-worker"
SER_CRR_TASK_Q="crr-task-queue"
SER_CRR_BULK_INTIMATION_Q="crr-bulk-intimation-queue"
SER_CRR_BULK_SMS_Q="crr-bulk-sms-queue"
BASEDIR=$(dirname $(realpath "$0"))
cd $BASEDIR

start_worker(){
    SCRIPT=$1
    LOG_FILE=$2
    PID_FILE=$3
    QUEUE_NAME=$4
    if [ -f "$PID_FILE" ] &&  kill -0 `cat $PID_FILE` > /dev/null 2>&1
    then
        printf "$RED $SCRIPT already running $RESTORE\n"
    else
        nohup php $SCRIPT $QUEUE_NAME $NUCLEUS_CONF > $LOG_FILE 2>&1 &
        echo $! > $PID_FILE
        printf "\nStarted $SCRIPT $QUEUE_NAME\n"
    fi
}

stop_worker(){
    SCRIPT=$1
    PID_FILE=$2
    QUEUE_NAME=$3
    if [ -f "$PID_FILE" ]
    then
        kill `cat $PID_FILE`
        rm $PID_FILE
        printf "\nStopped $SCRIPT $QUEUE_NAME\n"
    fi
}

execute_action(){
    ACTION=$1
    SCRIPT=$2
    LOG_FILE=$3
    PID_FILE=$4
    QUEUE_NAME=$5
    case $ACTION
    in
        "start")
            start_worker $SCRIPT $LOG_FILE $PID_FILE $QUEUE_NAME
            ;;
        "stop")
            stop_worker $SCRIPT $PID_FILE $QUEUE_NAME
            ;;
        "restart")
            execute_action stop $SCRIPT $LOG_FILE $PID_FILE $QUEUE_NAME
            execute_action start $SCRIPT $LOG_FILE $PID_FILE $QUEUE_NAME
            ;;
        *)
            echo "Invalid operation"
            ;;
    esac
}

crr_task_queue_worker(){
    ACTION=$1
    QUEUE_NAME="CRR_TASK_QUEUE"
    for i in $(seq 1 1 1)
    do 
        PID_FILE="$PID_LOCATION$CRR_TASK_QUEUE$i.pid"
        LOG_FILE="$LOG_LOCATION$CRR_TASK_QUEUE$i.log"
        execute_action $ACTION "crr_task_queue_worker.php" $LOG_FILE $PID_FILE $QUEUE_NAME
    done
}


crr_bulk_intimation_worker(){
    ACTION=$1
    QUEUE_NAME="CRR_BULK_INTIMATION_QUEUE"
    for i in $(seq 1 1 1)
    do 
        PID_FILE="$PID_LOCATION$CRR_BULK_INTIMATION_QUEUE$i.pid"
        LOG_FILE="$LOG_LOCATION$CRR_BULK_INTIMATION_QUEUE$i.log"
        execute_action $ACTION "crr_intimation_worker.php" $LOG_FILE $PID_FILE $QUEUE_NAME
    done
}


crr_bulk_sms_queue_worker(){
    ACTION=$1
    QUEUE_NAME="CRR_BULK_SMS_QUEUE"
    for i in $(seq 1 1 1)
    do 
        PID_FILE="$PID_LOCATION$CRR_BULK_SMS_QUEUE$i.pid"
        LOG_FILE="$LOG_LOCATION$CRR_BULK_SMS_QUEUE$i.log"
         execute_action $ACTION "crr_intimation_worker.php" $LOG_FILE $PID_FILE $QUEUE_NAME
    done
}
###   MAIN   ###

if [ "$(whoami)" != "root" ]
then
    printf "$RED Need to run this script using$YELLOW sudo $RESTORE \n"
    exit 1
fi

# Read nucleus conf from .cli.env
NUCLEUS_CONF=$(grep NUCLEUS_CONF ../.cli.env | xargs)
if [ -z "$NUCLEUS_CONF" ]
then
    printf "$RED Could not find NUCLEUS_CONF in .cli.env, \nPlease add variable NUCLEUS_CONF in ../cli.env\n$RESTORE"
    exit 1
fi

# create the log file location if it does not exists
mkdir -p $LOG_LOCATION

OP=$1
SERVICE=$2

case $OP in
    "start")
        case $SERVICE in
            $SER_CRR_TASK_Q)
                crr_task_queue_worker start
                ;;
            $SER_CRR_BULK_INTIMATION_Q)
                crr_bulk_intimation_worker start
                ;;
            $SER_CRR_BULK_SMS_Q)
                crr_bulk_sms_queue_worker start
                ;;
            *)
                 if [ -z $SERVICE ]
                    then
                        crr_task_queue_worker start
                        crr_bulk_intimation_worker start
                        crr_bulk_sms_queue_worker start
                 else
                    printf "$RED Invalid service. Possible values are : [$SER_CRR_TASK_Q, $SER_CRR_BULK_INTIMATION_Q, $SER_CRR_BULK_SMS_Q]\n"
                 fi
                 ;;
        esac
        ;;
    "stop")
        case $SERVICE in
            $SER_CRR_TASK_Q)
                crr_task_queue_worker stop
                ;;
            $SER_CRR_BULK_INTIMATION_Q)
                crr_bulk_intimation_worker stop
                ;;
            $SER_CRR_BULK_SMS_Q)
                crr_bulk_sms_queue_worker stop
                ;;
            *)
                 if [ -z $SERVICE ]
                    then
                        crr_task_queue_worker stop
                        crr_bulk_intimation_worker stop
                        crr_bulk_sms_queue_worker stop
                 else
                    printf "$RED Invalid service. Possible values are : [$SER_CRR_TASK_Q, $SER_CRR_BULK_INTIMATION_Q, $SER_CRR_BULK_SMS_Q]\n"
                 fi
                 ;;
        esac
        ;;
    "restart")
        case $SERVICE in
            $SER_CRR_TASK_Q)
                crr_task_queue_worker restart
                ;;
            $SER_CRR_BULK_INTIMATION_Q)
                crr_bulk_intimation_worker restart
                ;;
            $SER_CRR_BULK_SMS_Q)
                crr_bulk_sms_queue_worker restart
                ;;
            *)
                 if [ -z $SERVICE ]
                    then
                        crr_task_queue_worker restart
                        crr_bulk_intimation_worker restart
                        crr_bulk_sms_queue_worker restart
                 else
                    printf "$RED Invalid service. Possible values are : [$SER_CRR_TASK_Q, $SER_CRR_BULK_INTIMATION_Q, $SER_CRR_BULK_SMS_Q]\n"
                 fi
                 ;;
        esac
        ;;
    *)
        printf "$RED Invalid operation. Available operations:$RESTORE \n\n"
        printf "$YELLOW sudo ./manage_worker.sh start [SERVICE]$BLUE To start all queue workers\n"
        printf "$YELLOW sudo ./manage_worker.sh stop [SERVICE]$BLUE To stop all queue workers\n"
        printf "$YELLOW sudo ./manage_worker.sh restart [SERVICE]$BLUE To restart all queue workers\n\n\n"
        printf "$CYAN SERVICE $PURPLE (optional) could be any one of [$SER_CRR_TASK_Q, $SER_CRR_BULK_INTIMATION_Q, $SER_CRR_BULK_SMS_Q]; If nothing is specified all services will be considered\n\n$RESTORE"
        ;;
esac
