#!/bin/bash
#
# Script de diagnosticare pentru probleme UnderChat IRCd
# Limba: Română
#

# Culori
VERDE='\033[0;32m'
GALBEN='\033[1;33m'
ALBASTRU='\033[0;34m'
ROSU='\033[0;31m'
NC='\033[0m'

PREFIX="${PREFIX:-$HOME/ircd}"
IRCD_BIN="$PREFIX/bin/ircd"
CONFIG_FILE="${PREFIX}/etc/ircd.conf"
LOG_FILE="${PREFIX}/log/ircd.log"

echo -e "${ALBASTRU}"
echo "╔════════════════════════════════════════╗"
echo "║   Diagnosticare UnderChat IRCd        ║"
echo "║   Versiune: v1.0.2                     ║"
echo "╚════════════════════════════════════════╝"
echo -e "${NC}"
echo ""

# 1. Verificare fișier configurare
echo -e "${GALBEN}[1/8] Verificare fișier configurare...${NC}"
echo ""

if [ ! -e "$CONFIG_FILE" ]; then
    echo -e "${ROSU}  ✗ Fișier NU EXISTĂ: $CONFIG_FILE${NC}"
    echo -e "${GALBEN}  → Soluție: Rulează ./install.sh sau creează manual${NC}"
    exit 1
else
    echo -e "${VERDE}  ✓ Fișier există${NC}"
fi

if [ ! -f "$CONFIG_FILE" ]; then
    echo -e "${ROSU}  ✗ Calea nu este un fișier obișnuit${NC}"
    ls -ld "$CONFIG_FILE"
    exit 1
else
    echo -e "${VERDE}  ✓ Este fișier obișnuit${NC}"
fi

if [ ! -r "$CONFIG_FILE" ]; then
    echo -e "${ROSU}  ✗ Fișier NU POATE FI CITIT${NC}"
    echo -e "${GALBEN}  → Permisiuni curente:${NC}"
    ls -la "$CONFIG_FILE"
    echo -e "${GALBEN}  → Soluție: chmod 600 $CONFIG_FILE${NC}"
    exit 1
else
    echo -e "${VERDE}  ✓ Poate fi citit${NC}"
fi

if [ ! -s "$CONFIG_FILE" ]; then
    echo -e "${ROSU}  ✗ Fișier este GOL (0 bytes)${NC}"
    echo -e "${GALBEN}  → Soluție: Regenerează config${NC}"
    exit 1
else
    local size=$(stat -f%z "$CONFIG_FILE" 2>/dev/null || stat -c%s "$CONFIG_FILE" 2>/dev/null)
    echo -e "${VERDE}  ✓ Mărime: $size bytes${NC}"
fi

# 2. Verificare permisiuni detaliate
echo ""
echo -e "${GALBEN}[2/8] Verificare permisiuni detaliate...${NC}"
echo ""

ls -la "$CONFIG_FILE"

local owner=$(stat -f%Su "$CONFIG_FILE" 2>/dev/null || stat -c%U "$CONFIG_FILE" 2>/dev/null)
local current_user=$(whoami)

echo ""
if [ "$owner" != "$current_user" ]; then
    echo -e "${GALBEN}  ⚠ Proprietar fișier: $owner (tu ești: $current_user)${NC}"
    echo -e "${GALBEN}  → Acest lucru poate cauza probleme de permisiuni${NC}"
else
    echo -e "${VERDE}  ✓ Proprietar fișier: $owner (corect)${NC}"
fi

# 3. Verificare conținut fișier
echo ""
echo -e "${GALBEN}[3/8] Verificare conținut fișier...${NC}"
echo ""

local lines=$(wc -l < "$CONFIG_FILE")
echo -e "  Linii total: $lines"

local general_blocks=$(grep -c "^General {" "$CONFIG_FILE" 2>/dev/null || echo 0)
echo -e "  Blocuri General: $general_blocks"

if [ "$general_blocks" -eq 0 ]; then
    echo -e "${ROSU}  ✗ LIPSEȘTE blocul General { }!${NC}"
    echo -e "${GALBEN}  → Config invalid, trebuie să aibă cel puțin un bloc General${NC}"
fi

local port_blocks=$(grep -c "^Port {" "$CONFIG_FILE" 2>/dev/null || echo 0)
echo -e "  Blocuri Port: $port_blocks"

if [ "$port_blocks" -eq 0 ]; then
    echo -e "${ROSU}  ✗ LIPSEȘTE blocul Port { }!${NC}"
    echo -e "${GALBEN}  → Serverul nu va avea porturi de ascultare${NC}"
fi

# 4. Verificare sintaxă acolade
echo ""
echo -e "${GALBEN}[4/8] Verificare sintaxă acolade...${NC}"
echo ""

local open_braces=$(grep -o "{" "$CONFIG_FILE" | wc -l)
local close_braces=$(grep -o "}" "$CONFIG_FILE" | wc -l)

echo -e "  Acolade deschise { : $open_braces"
echo -e "  Acolade închise } : $close_braces"

if [ "$open_braces" -ne "$close_braces" ]; then
    echo -e "${ROSU}  ✗ ACOLADE NEPOTRIVITE!${NC}"
    echo -e "${GALBEN}  → Diferență: $(($open_braces - $close_braces))${NC}"
else
    echo -e "${VERDE}  ✓ Acolade potrivite${NC}"
fi

# 5. Verificare executabil ircd
echo ""
echo -e "${GALBEN}[5/8] Verificare executabil ircd...${NC}"
echo ""

if [ ! -f "$IRCD_BIN" ]; then
    echo -e "${ROSU}  ✗ Executabil NU EXISTĂ: $IRCD_BIN${NC}"
    echo -e "${GALBEN}  → Soluție: Rulează ./install.sh pentru compilare${NC}"
    exit 1
else
    echo -e "${VERDE}  ✓ Executabil există${NC}"
fi

if [ ! -x "$IRCD_BIN" ]; then
    echo -e "${ROSU}  ✗ Executabil NU ARE permisiuni de execuție${NC}"
    echo -e "${GALBEN}  → Soluție: chmod +x $IRCD_BIN${NC}"
    exit 1
else
    echo -e "${VERDE}  ✓ Permisiuni execuție OK${NC}"
fi

# 6. Test sintaxă configurare cu ircd
echo ""
echo -e "${GALBEN}[6/8] Test sintaxă cu ircd -c...${NC}"
echo ""

if "$IRCD_BIN" -c -f "$CONFIG_FILE" > /tmp/ircd_config_test.log 2>&1; then
    echo -e "${VERDE}  ✓ Config VALID - Sintaxă OK${NC}"
    cat /tmp/ircd_config_test.log
else
    echo -e "${ROSU}  ✗ Config INVALID - Erori detectate:${NC}"
    echo -e "${GALBEN}────────────────────────────────────────${NC}"
    cat /tmp/ircd_config_test.log
    echo -e "${GALBEN}────────────────────────────────────────${NC}"
    rm -f /tmp/ircd_config_test.log
    exit 1
fi

rm -f /tmp/ircd_config_test.log

# 7. Verificare directoare necesare
echo ""
echo -e "${GALBEN}[7/8] Verificare directoare necesare...${NC}"
echo ""

for dir in "$PREFIX/bin" "$PREFIX/etc" "$PREFIX/log"; do
    if [ ! -d "$dir" ]; then
        echo -e "${ROSU}  ✗ Director lipsă: $dir${NC}"
        echo -e "${GALBEN}  → Creare: mkdir -p $dir${NC}"
        mkdir -p "$dir"
    else
        echo -e "${VERDE}  ✓ $dir${NC}"
    fi
done

# 8. Verificare proces pornit
echo ""
echo -e "${GALBEN}[8/8] Verificare proces IRCd...${NC}"
echo ""

if pgrep -f "$IRCD_BIN" > /dev/null; then
    local pid=$(pgrep -f "$IRCD_BIN")
    echo -e "${VERDE}  ✓ Proces PORNIT${NC}"
    echo -e "  PID: $pid"
    ps aux | grep "$pid" | grep -v grep
else
    echo -e "${GALBEN}  ℹ Niciun proces activ${NC}"
    echo -e "  (Aceasta este normal dacă nu ai pornit serverul)${NC}"
fi

# Sumar final
echo ""
echo -e "${ALBASTRU}╔════════════════════════════════════════╗${NC}"
echo -e "${ALBASTRU}║   SUMAR DIAGNOSTICARE                 ║${NC}"
echo -e "${ALBASTRU}╚════════════════════════════════════════╝${NC}"
echo ""

if [ "$general_blocks" -gt 0 ] && [ "$port_blocks" -gt 0 ] && [ "$open_braces" -eq "$close_braces" ]; then
    echo -e "${VERDE}✓ Toate verificările au trecut cu succes!${NC}"
    echo -e "${VERDE}✓ Configurarea pare să fie validă.${NC}"
    echo ""
    echo -e "${GALBEN}Poți porni serverul cu:${NC}"
    echo -e "  $IRCD_BIN -f $CONFIG_FILE"
    echo ""
    echo -e "${GALBEN}SAU folosind meniul admin:${NC}"
    echo -e "  ./admin.sh → opțiunea 1 (Pornire server)"
    echo ""
else
    echo -e "${ROSU}✗ Au fost detectate probleme!${NC}"
    echo ""
    echo -e "${GALBEN}Pași recomandați:${NC}"
    echo -e "  1. Verifică manual config: nano $CONFIG_FILE"
    echo -e "  2. Compară cu exemplu: cat doc/example.conf"
    echo -e "  3. SAU regenerează config: ./admin.sh → opțiunea 5"
    echo ""
fi

echo -e "${GALBEN}Pentru mai multe detalii:${NC}"
echo -e "  - Verifică log: tail -f $LOG_FILE"
echo -e "  - Rulează admin: ./admin.sh"
echo ""

