#!/bin/bash

################################################################################
# IP-Camera Restreaming — 3 камеры
# Версия: 2.0
# Схема: IP-камеры → MediaMTX (RTSP) → FFmpeg (склейка) → MediaMTX (HLS) → Nginx
################################################################################

set -e

# ──────────────────────────────────────────────────────────────────────────────
# КОНФИГУРАЦИЯ — ИЗМЕНИТЬ ПЕРЕД ЗАПУСКОМ
# ──────────────────────────────────────────────────────────────────────────────

CAMERA1_IP="192.168.1.172"
CAMERA1_USER="admin"
CAMERA1_PASS="6625ce45f1"
CAMERA1_PATH="cam/realmonitor?channel=1&subtype=0"

CAMERA2_IP="192.168.1.108"
CAMERA2_USER="admin"
CAMERA2_PASS="6625ce45f1"
CAMERA2_PATH="cam/realmonitor?channel=1&subtype=0"

CAMERA3_IP="192.168.1.191"
CAMERA3_USER="admin"
CAMERA3_PASS="6625ce45f1"
CAMERA3_PATH="cam/realmonitor?channel=1&subtype=0"

RESTREAMING_DIR="/var/restreaming"
NGINX_PORT="9999"
MEDIAMTX_ARCHIVE="mediamtx_v1.9.3_linux_amd64.tar.gz"

# ──────────────────────────────────────────────────────────────────────────────

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

ok()   { echo -e "${GREEN}[OK]${NC} $1"; }
err()  { echo -e "${RED}[ERROR]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
hdr()  { echo ""; echo "══════════════════════════════════════════"; echo "  $1"; echo "══════════════════════════════════════════"; echo ""; }

if [ "$EUID" -ne 0 ]; then
    err "Запустите скрипт с правами root: sudo ./install-restreaming-3cam.sh"
    exit 1
fi

if [ ! -f "$MEDIAMTX_ARCHIVE" ]; then
    err "Архив $MEDIAMTX_ARCHIVE не найден в текущей директории!"
    exit 1
fi

SERVER_IP=$(hostname -I | awk '{print $1}')

echo ""
echo "══════════════════════════════════════════"
echo "  IP-Camera Restreaming v2.0 — 3 камеры"
echo "══════════════════════════════════════════"
echo "  Nginx порт: $NGINX_PORT"
echo "  Сервер IP:  $SERVER_IP"
echo ""

################################################################################
# ШАГ 1: ОЧИСТКА СТАРЫХ ВЕРСИЙ
################################################################################

hdr "Шаг 1/7: Очистка старых версий"

for SVC in mediamtx.service ffmpeg-composite.service ip-camera-restreaming.service; do
    if systemctl list-unit-files 2>/dev/null | grep -q "^${SVC}"; then
        echo "  - Останавливаем $SVC..."
        systemctl stop "$SVC"    2>/dev/null || true
        systemctl disable "$SVC" 2>/dev/null || true
    fi
done

killall -9 mediamtx 2>/dev/null || true
killall -9 ffmpeg   2>/dev/null || true

rm -f /etc/systemd/system/mediamtx.service
rm -f /etc/systemd/system/ffmpeg-composite.service
rm -f /etc/systemd/system/ip-camera-restreaming.service
rm -f /usr/local/bin/start-ip-camera-restreaming.sh
rm -rf "${RESTREAMING_DIR:?}"/*

systemctl daemon-reload
ok "Старые версии удалены"

################################################################################
# ШАГ 2: ПАКЕТЫ
################################################################################

hdr "Шаг 2/7: Проверка пакетов"

if ping -c 1 -W 3 8.8.8.8 &>/dev/null; then
    echo "Интернет доступен, устанавливаем пакеты..."
    apt-get update -qq
    apt-get install -y nginx ffmpeg ufw
    ok "Пакеты установлены"
else
    warn "Интернет недоступен, проверяем наличие пакетов..."
    MISSING=""
    command -v nginx  &>/dev/null || MISSING="$MISSING nginx"
    command -v ffmpeg &>/dev/null || MISSING="$MISSING ffmpeg"
    if [ -n "$MISSING" ]; then
        err "Не установлены:$MISSING — установите вручную: apt-get install -y$MISSING"
        exit 1
    fi
    ok "Все необходимые пакеты присутствуют"
fi

################################################################################
# ШАГ 3: MEDIAMTX
################################################################################

hdr "Шаг 3/7: Установка MediaMTX"

tar -xzf "$MEDIAMTX_ARCHIVE"
cp mediamtx /usr/local/bin/mediamtx
chmod +x /usr/local/bin/mediamtx
rm -f mediamtx mediamtx.yml LICENSE README.md

ok "MediaMTX установлен: $(/usr/local/bin/mediamtx --version 2>&1 | head -1)"

################################################################################
# ШАГ 4: ДИРЕКТОРИИ
################################################################################

hdr "Шаг 4/7: Создание директорий"

mkdir -p /etc/mediamtx
mkdir -p "$RESTREAMING_DIR"
mkdir -p /var/log/ffmpeg
chown -R root:root "$RESTREAMING_DIR"
chmod 755 "$RESTREAMING_DIR"

ok "Директории готовы"

################################################################################
# ШАГ 5: КОНФИГУРАЦИЯ MEDIAMTX
################################################################################

hdr "Шаг 5/7: Конфигурация MediaMTX"

cat > /etc/mediamtx/mediamtx.yml << EOF
# MediaMTX Configuration — 3 камеры

logLevel: info
logDestinations: [file]
logFile: /var/log/mediamtx.log

api: yes
apiAddress: 127.0.0.1:9997

hls: yes
hlsAddress: :8888
hlsEncryption: no
hlsAlwaysRemux: no
hlsVariant: mpegts
hlsSegmentCount: 3
hlsSegmentDuration: 1s
hlsPartDuration: 500ms
hlsSegmentMaxSize: 50M
hlsDirectory: ${RESTREAMING_DIR}

rtspAddress: :8554
protocols: [tcp]
readTimeout: 30s
writeTimeout: 30s

paths:
  cam1:
    source: rtsp://${CAMERA1_USER}:${CAMERA1_PASS}@${CAMERA1_IP}:554/${CAMERA1_PATH}
    sourceProtocol: tcp
    sourceOnDemand: no

  cam2:
    source: rtsp://${CAMERA2_USER}:${CAMERA2_PASS}@${CAMERA2_IP}:554/${CAMERA2_PATH}
    sourceProtocol: tcp
    sourceOnDemand: no

  cam3:
    source: rtsp://${CAMERA3_USER}:${CAMERA3_PASS}@${CAMERA3_IP}:554/${CAMERA3_PATH}
    sourceProtocol: tcp
    sourceOnDemand: no

  composite:
    sourceProtocol: tcp
    sourceOnDemand: no
EOF

ok "Конфигурация MediaMTX создана"

################################################################################
# ШАГ 6: SYSTEMD СЕРВИСЫ
################################################################################

hdr "Шаг 6/7: Создание сервисов"

cat > /etc/systemd/system/mediamtx.service << 'EOF'
[Unit]
Description=MediaMTX — RTSP/HLS streaming server
After=network.target

[Service]
Type=simple
User=root
ExecStartPre=-/usr/bin/killall -9 mediamtx
ExecStartPre=/bin/sleep 2
ExecStart=/usr/local/bin/mediamtx /etc/mediamtx/mediamtx.yml
Restart=always
RestartSec=10
TimeoutStartSec=30s
TimeoutStopSec=10s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

cat > /etc/systemd/system/ffmpeg-composite.service << 'EOF'
[Unit]
Description=FFmpeg — 3-Camera Compositor
After=mediamtx.service
Requires=mediamtx.service

[Service]
Type=simple
User=root
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/ffmpeg \
    -rtsp_transport tcp -fflags +genpts -i rtsp://127.0.0.1:8554/cam1 \
    -rtsp_transport tcp -fflags +genpts -i rtsp://127.0.0.1:8554/cam2 \
    -rtsp_transport tcp -fflags +genpts -i rtsp://127.0.0.1:8554/cam3 \
    -filter_complex "[0:v]scale=640:360[v0];[1:v]scale=640:360[v1];[2:v]scale=640:360[v2];[v0][v1][v2]hstack=inputs=3[out]" \
    -map "[out]" \
    -c:v libx264 \
    -preset ultrafast \
    -tune zerolatency \
    -g 25 \
    -b:v 2000k \
    -maxrate 2000k \
    -bufsize 4000k \
    -f rtsp \
    -rtsp_transport tcp \
    rtsp://127.0.0.1:8554/composite
Restart=always
RestartSec=5
StandardOutput=file:/var/log/ffmpeg/composite.log
StandardError=file:/var/log/ffmpeg/composite_error.log

[Install]
WantedBy=multi-user.target
EOF

cat > /etc/logrotate.d/mediamtx << 'EOF'
/var/log/mediamtx.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
    postrotate
        systemctl kill -s HUP mediamtx.service > /dev/null 2>&1 || true
    endscript
}
EOF

cat > /etc/logrotate.d/ffmpeg-composite << 'EOF'
/var/log/ffmpeg/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
}
EOF

ok "Сервисы созданы"

################################################################################
# ШАГ 7: NGINX
################################################################################

hdr "Шаг 7/7: Настройка Nginx"

cat > /etc/nginx/sites-available/restreaming << EOF
server {
    listen ${NGINX_PORT};
    server_name localhost;

    location /camera/ {
        proxy_pass http://127.0.0.1:8888/composite/;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
        add_header Access-Control-Allow-Origin "*" always;
        add_header Cache-Control "no-cache, no-store, must-revalidate" always;
    }

    location / {
        root ${RESTREAMING_DIR};
        autoindex on;
    }
}
EOF

ln -sf /etc/nginx/sites-available/restreaming /etc/nginx/sites-enabled/restreaming
rm -f /etc/nginx/sites-enabled/default

nginx -t || { err "Ошибка конфигурации Nginx!"; exit 1; }
systemctl restart nginx
ok "Nginx настроен на порту ${NGINX_PORT}"

if command -v ufw &>/dev/null; then
    ufw allow "${NGINX_PORT}/tcp" 2>/dev/null || true
    ufw reload 2>/dev/null || true
    ok "UFW: открыт порт ${NGINX_PORT}/tcp"
fi

################################################################################
# ЗАПУСК
################################################################################

hdr "Запуск сервисов"

systemctl daemon-reload
systemctl enable mediamtx.service ffmpeg-composite.service

echo "Запускаем mediamtx..."
systemctl start mediamtx.service
sleep 5

echo "Запускаем ffmpeg-composite (ждём 10 сек)..."
systemctl start ffmpeg-composite.service
sleep 10

################################################################################
# ИТОГ
################################################################################

hdr "Результат установки"

MEDIAMTX_STATUS=$(systemctl is-active mediamtx.service       2>/dev/null || echo "error")
FFMPEG_STATUS=$(systemctl is-active ffmpeg-composite.service  2>/dev/null || echo "error")
NGINX_STATUS=$(systemctl is-active nginx.service              2>/dev/null || echo "error")

[ "$MEDIAMTX_STATUS" = "active" ]                                        && ok "mediamtx.service — работает"         || err "mediamtx.service — НЕ ЗАПУЩЕН"
{ [ "$FFMPEG_STATUS" = "active" ] || [ "$FFMPEG_STATUS" = "activating" ]; } && ok "ffmpeg-composite.service — работает" || err "ffmpeg-composite.service — НЕ ЗАПУЩЕН"
[ "$NGINX_STATUS"    = "active" ]                                        && ok "nginx.service — работает"            || err "nginx.service — НЕ ЗАПУЩЕН"

echo ""
echo "══════════════════════════════════════════"
echo "  ГОТОВО"
echo "══════════════════════════════════════════"
echo ""
echo "  URL потока:"
echo "  http://${SERVER_IP}:${NGINX_PORT}/camera/index.m3u8"
echo ""
echo "  Проверка:"
echo "  curl -s http://localhost:${NGINX_PORT}/camera/index.m3u8 | head -3"
echo ""
echo "  Управление:"
echo "  sudo systemctl restart mediamtx.service"
echo "  sudo systemctl restart ffmpeg-composite.service"
echo ""
echo "  Логи:"
echo "  sudo tail -f /var/log/mediamtx.log"
echo "  sudo tail -f /var/log/ffmpeg/composite_error.log"
echo ""
