#!/bin/bash

###############################################################################
# Redis Performance Validation Script
#
# This script validates Redis performance under load by checking:
# - Connection status
# - Memory usage
# - Command execution times
# - Hit/miss ratio
# - Connection count
#
# Usage: ./validate-redis-performance.sh
###############################################################################

set -e

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo "=========================================="
echo "Redis Performance Validation"
echo "=========================================="
echo ""

# Load environment variables
if [ -f .env ]; then
    export $(cat .env | grep -v '^#' | xargs)
fi

# Redis connection details
REDIS_SCHEME=${REDIS_SCHEME:-tcp}
REDIS_HOST=${REDIS_HOST:-127.0.0.1}
REDIS_PORT=${REDIS_PORT:-6379}
REDIS_PATH=${REDIS_PATH:-/home/cbtappsc/redis/redis.sock}

# Determine redis-cli command
if [ "$REDIS_SCHEME" = "unix" ]; then
    REDIS_CLI="redis-cli -s ${REDIS_PATH}"
    echo "Using Redis Unix socket: ${REDIS_PATH}"
else
    REDIS_CLI="redis-cli -h ${REDIS_HOST} -p ${REDIS_PORT}"
    echo "Using Redis TCP: ${REDIS_HOST}:${REDIS_PORT}"
fi

echo ""

# Check if Redis is accessible
echo -e "${YELLOW}Checking Redis connection...${NC}"
if $REDIS_CLI ping > /dev/null 2>&1; then
    echo -e "${GREEN}✓ Redis connection successful${NC}"
else
    echo -e "${RED}✗ Cannot connect to Redis${NC}"
    exit 1
fi

echo ""
echo "=========================================="
echo "1. Redis Server Info"
echo "=========================================="

$REDIS_CLI INFO server | grep -E "redis_version|os|tcp_port|uptime_in_days"

echo ""
echo "=========================================="
echo "2. Memory Usage"
echo "=========================================="

MEMORY_INFO=$($REDIS_CLI INFO memory | grep -E "used_memory_human|maxmemory_human|maxmemory_policy|mem_fragmentation_ratio")

echo "$MEMORY_INFO"

# Check memory usage
USED_MEMORY=$($REDIS_CLI INFO memory | grep used_memory: | cut -d: -f2 | tr -d '\r')
if [ ! -z "$USED_MEMORY" ]; then
    USED_MB=$((USED_MEMORY / 1024 / 1024))
    echo "Used Memory: ${USED_MB}MB"

    if [ $USED_MB -lt 100 ]; then
        echo -e "${GREEN}✓ Memory usage is low${NC}"
    elif [ $USED_MB -lt 500 ]; then
        echo -e "${YELLOW}⚠ Memory usage is moderate${NC}"
    else
        echo -e "${RED}✗ Memory usage is high${NC}"
    fi
fi

echo ""
echo "=========================================="
echo "3. Key Statistics"
echo "=========================================="

DB_SIZE=$($REDIS_CLI DBSIZE)
echo "Total Keys: $DB_SIZE"

# Count keys by pattern
echo ""
echo "Keys by pattern:"
echo "  laravel_database_: $($REDIS_CLI --scan --pattern 'laravel_database_*' | wc -l)"
echo "  laravel_cache_: $($REDIS_CLI --scan --pattern 'laravel_cache_*' | wc -l)"
echo "  laravel_session_: $($REDIS_CLI --scan --pattern 'laravel_session_*' | wc -l)"
echo "  lbb_token_balance_: $($REDIS_CLI --scan --pattern 'lbb_token_balance_*' | wc -l)"

echo ""
echo "=========================================="
echo "4. Connection Statistics"
echo "=========================================="

CLIENTS_INFO=$($REDIS_CLI INFO clients | grep -E "connected_clients|blocked_clients|rejected_connections")

echo "$CLIENTS_INFO"

# Check connection count
CONNECTED_CLIENTS=$($REDIS_CLI INFO clients | grep connected_clients: | cut -d: -f2 | tr -d '\r')
echo "Connected Clients: $CONNECTED_CLIENTS"

if [ $CONNECTED_CLIENTS -lt 50 ]; then
    echo -e "${GREEN}✓ Connection count is low${NC}"
elif [ $CONNECTED_CLIENTS -lt 200 ]; then
    echo -e "${YELLOW}⚠ Connection count is moderate${NC}"
else
    echo -e "${RED}✗ Connection count is high${NC}"
fi

echo ""
echo "=========================================="
echo "5. Cache Performance"
echo "=========================================="

STATS_INFO=$($REDIS_CLI INFO stats | grep -E "keyspace_hits:keyspace_misses|keyspace_hits|keyspace_misses")

HITS=$($REDIS_CLI INFO stats | grep keyspace_hits: | cut -d: -f2 | tr -d '\r')
MISSES=$($REDIS_CLI INFO stats | grep keyspace_misses: | cut -d: -f2 | tr -d '\r')

if [ ! -z "$HITS" ] && [ ! -z "$MISSES" ]; then
    TOTAL=$((HITS + MISSES))

    if [ $TOTAL -gt 0 ]; then
        HIT_RATE=$((HITS * 100 / TOTAL))
        echo "Hit Rate: ${HIT_RATE}%"
        echo "Hits: $HITS"
        echo "Misses: $MISSES"

        if [ $HIT_RATE -gt 80 ]; then
            echo -e "${GREEN}✓ Cache hit rate is excellent${NC}"
        elif [ $HIT_RATE -gt 60 ]; then
            echo -e "${YELLOW}⚠ Cache hit rate could be improved${NC}"
        else
            echo -e "${RED}✗ Cache hit rate is poor${NC}"
        fi
    else
        echo "No cache activity yet"
    fi
fi

echo ""
echo "=========================================="
echo "6. Command Performance Test"
echo "=========================================="

# Test SET operation
echo -n "Testing SET operation... "
START_TIME=$(date +%s%N)
$REDIS_CLI SET test_perf_key "test_value" > /dev/null
END_TIME=$(date +%s%N)
SET_TIME=$(( (END_TIME - START_TIME) / 1000000 ))
echo "${SET_TIME}ms"

if [ $SET_TIME -lt 5 ]; then
    echo -e "${GREEN}✓ SET operation is fast${NC}"
else
    echo -e "${YELLOW}⚠ SET operation could be faster${NC}"
fi

# Test GET operation
echo -n "Testing GET operation... "
START_TIME=$(date +%s%N)
$REDIS_CLI GET test_perf_key > /dev/null
END_TIME=$(date +%s%N)
GET_TIME=$(( (END_TIME - START_TIME) / 1000000 ))
echo "${GET_TIME}ms"

if [ $GET_TIME -lt 5 ]; then
    echo -e "${GREEN}✓ GET operation is fast${NC}"
else
    echo -e "${YELLOW}⚠ GET operation could be faster${NC}"
fi

# Test MGET operation (10 keys)
echo -n "Testing MGET operation (10 keys)... "
for i in {1..10}; do
    $REDIS_CLI SET "test_perf_key_$i" "test_value_$i" > /dev/null
done
START_TIME=$(date +%s%N)
$REDIS_CLI MGET test_perf_key_{1..10} > /dev/null
END_TIME=$(date +%s%N)
MGET_TIME=$(( (END_TIME - START_TIME) / 1000000 ))
echo "${MGET_TIME}ms"

if [ $MGET_TIME -lt 10 ]; then
    echo -e "${GREEN}✓ MGET operation is fast${NC}"
else
    echo -e "${YELLOW}⚠ MGET operation could be faster${NC}"
fi

# Cleanup test keys
$REDIS_CLI DEL test_perf_key test_perf_key_{1..10} > /dev/null

echo ""
echo "=========================================="
echo "7. Slow Query Log"
echo "=========================================="

SLOWLOG=$($REDIS_CLI SLOWLOG GET 10)
if [ -n "$SLOWLOG" ] && [ "$SLOWLOG" != "Empty list" ]; then
    echo "Slow commands (last 10):"
    echo "$SLOWLOG"
else
    echo "No slow commands recorded"
fi

echo ""
echo "=========================================="
echo "8. Persistence"
echo "=========================================="

PERSISTENCE_INFO=$($REDIS_CLI INFO persistence | grep -E "rdb_last_save_time|aof_enabled")

echo "$PERSISTENCE_INFO"

echo ""
echo -e "${GREEN}Redis validation complete!${NC}"
echo "=========================================="
