#!/bin/bash
shopt -s nullglob

BASE_DIR="/home/user/RIDSYSPACKAGE/riptv/live"
ACTIVE_FILE="/usr/local/bin/Active_Stream"
RESTART_BIN="/usr/local/bin"
PID_DIR="/home/user/RIDSYSPACKAGE/pid"

LOG_INDEX="/home/user/RIDSYSPACKAGE/restart_index.txt"
LOG_PID="/home/user/RIDSYSPACKAGE/stream_restart.log"

# clear logs ONCE
: > "$LOG_INDEX"
: > "$LOG_PID"

while true; do

    # -------------------------------------------------
    # Cleanup old TS / M3U8
    # -------------------------------------------------
    for dir in "$BASE_DIR"/*/; do
        find "$dir" -type f \( -name "*.ts" -o -name "*.m3u8" \) -mmin +6 -delete \
            && echo "$(date '+%F %T') Deleted old TS/M3U8 in $dir" >> "$BASE_DIR/Delete.txt"
    done

    # -------------------------------------------------
    # ACTIVE_STREAM → index.m3u8 truth check
    # -------------------------------------------------
    while IFS= read -r CHANNEL || [[ -n "$CHANNEL" ]]; do
        [[ -z "$CHANNEL" ]] && continue

        TIME=$(date '+%F %T')

        STREAM_DIR="$BASE_DIR/$CHANNEL"
        INDEX_FILE="$STREAM_DIR/index.m3u8"
        RESTART_CMD="$RESTART_BIN/$CHANNEL"

        [[ ! -x "$RESTART_CMD" ]] && {
            echo "$TIME | $CHANNEL | ERROR | restart binary missing" >> "$LOG_INDEX"
            continue
        }

        if [[ ! -d "$STREAM_DIR" ]]; then
            echo "$TIME | $CHANNEL | DOWN | directory missing" >> "$LOG_INDEX"
            "$RESTART_CMD" restart >> "$LOG_INDEX" 2>&1
            continue
        fi

        if [[ ! -f "$INDEX_FILE" ]]; then
            echo "$TIME | $CHANNEL | DOWN | index.m3u8 missing" >> "$LOG_INDEX"
            "$RESTART_CMD" restart >> "$LOG_INDEX" 2>&1
            continue
        fi

        if [[ $(find "$INDEX_FILE" -mmin +5 -print) ]]; then
            echo "$TIME | $CHANNEL | STALE | index.m3u8 older than 5 min" >> "$LOG_INDEX"
            "$RESTART_CMD" restart >> "$LOG_INDEX" 2>&1
            continue
        fi

    done < "$ACTIVE_FILE"

    # -------------------------------------------------
    # PID safety check (secondary)
    # -------------------------------------------------
    for pidfile in "$PID_DIR"/*-pid; do
        [[ -f "$pidfile" ]] || continue

        TIME=$(date '+%F %T')
        CHANNEL=$(basename "$pidfile" | sed 's/-pid$//')
        PID=$(tr -d '[:space:]' < "$pidfile")
        RESTART_CMD="$RESTART_BIN/$CHANNEL"

        [[ ! -x "$RESTART_CMD" ]] && continue

        [[ ! "$PID" =~ ^[0-9]+$ ]] && {
            echo "$TIME | $CHANNEL | WARN | Invalid PID" >> "$LOG_PID"
            "$RESTART_CMD" restart >> "$LOG_PID" 2>&1
            continue
        }

        STAT=$(ps -o stat= -p "$PID" 2>/dev/null | tr -d ' ')

        [[ -z "$STAT" ]] && {
            echo "$TIME | $CHANNEL | INFO | PID not running" >> "$LOG_PID"
            "$RESTART_CMD" restart >> "$LOG_PID" 2>&1
            continue
        }

        if [[ "$STAT" == *Z* ]]; then
            PARENT_PID=$(ps -o ppid= -p "$PID" | tr -d ' ')
            [[ "$PARENT_PID" != "1" ]] && kill -9 "$PARENT_PID" 2>/dev/null
            echo "$TIME | $CHANNEL | ZOMBIE | Restarting" >> "$LOG_PID"
            "$RESTART_CMD" restart >> "$LOG_PID" 2>&1
        fi

    done

    # -------------------------------------------------
    # System metrics
    # -------------------------------------------------
    awk '{u=$2+$4; t=$2+$4+$5;
         if(NR==1){u1=u;t1=t}
         else print (u-u1)*100/(t-t1)"%"}' \
        <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat) \
        > "$BASE_DIR/Cpu_Status.txt"

    free | awk '/Mem/{print $3/$2*100}' > "$BASE_DIR/Memory_Status.txt"

    sleep 60
done
