#!/bin/bash

################################################################################
# MediaMTX Migration Script v3.1 - PRODUCTION FIX
# Автоматическая миграция с FFmpeg (v1) на MediaMTX (v3)
# Для рестриминга IP-камер (RTSP -> HLS) на АЗС
#
# ИСПРАВЛЕНИЯ v3.1:
#   - Отключение встроенного mediamtx.service (конфликт портов)
#   - Restart=on-failure + RestartSec=30 (защита от снежного кома)
#   - Nginx: proxy_http_version 1.1 + Connection "" (для LL-HLS)
#   - hlsAlwaysRemux: yes (HLS доступен сразу, без ожидания)
################################################################################

set -e

# Проверка прав root
if [ "$EUID" -ne 0 ]; then
    echo "ОШИБКА: Запустите скрипт с правами root (sudo)"
    exit 1
fi

# Цветовые коды для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

################################################################################
# КОНФИГУРАЦИЯ КАМЕРЫ
# ВАЖНО: Измените эти параметры перед запуском!
################################################################################

CAMERA_IP="192.168.1.108"
CAMERA_PORT="554"
CAMERA_USER="admin"
CAMERA_PASS="6625ce45f1"
CAMERA_PATH="cam/realmonitor?channel=1&subtype=0"

# Формирование RTSP URL
RTSP_URL="rtsp://${CAMERA_USER}:${CAMERA_PASS}@${CAMERA_IP}:${CAMERA_PORT}/${CAMERA_PATH}"

# Директории
RESTREAMING_DIR="/var/restreaming"
NGINX_PORT="9999"

################################################################################
# Функции для вывода
################################################################################

print_header() {
    echo ""
    echo "=========================================="
    echo "$1"
    echo "=========================================="
    echo ""
}

print_success() {
    echo -e "${GREEN}[OK]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

################################################################################
# ШАГ 0: ПОЛНАЯ ОЧИСТКА (старые версии + конфликтующие сервисы)
################################################################################

print_header "Шаг 0/9: Полная очистка"

echo "Проверка и остановка конфликтующих сервисов..."

# --- Остановка встроенного mediamtx.service (из архива MediaMTX) ---
if systemctl list-unit-files | grep -q "mediamtx.service"; then
    echo "  - Обнаружен встроенный mediamtx.service, отключаем..."
    systemctl stop mediamtx.service 2>/dev/null || true
    systemctl disable mediamtx.service 2>/dev/null || true
    # Удаляем unit-файл если он в systemd
    rm -f /etc/systemd/system/mediamtx.service
    rm -f /usr/lib/systemd/system/mediamtx.service
    rm -f /lib/systemd/system/mediamtx.service
    print_success "Встроенный mediamtx.service отключен"
fi

# --- Остановка нашего старого сервиса (любой версии) ---
if systemctl list-unit-files | grep -q "ip-camera-restreaming.service"; then
    echo "  - Останавливаем ip-camera-restreaming.service..."
    systemctl stop ip-camera-restreaming.service 2>/dev/null || true
    systemctl disable ip-camera-restreaming.service 2>/dev/null || true
    rm -f /etc/systemd/system/ip-camera-restreaming.service
fi

# --- Убиваем ВСЕ процессы mediamtx ---
echo "  - Завершаем все процессы mediamtx..."
killall -9 mediamtx 2>/dev/null || true
sleep 2
killall -9 mediamtx 2>/dev/null || true

# --- Ожидание освобождения портов ---
echo "  - Ожидаем освобождения портов..."
WAITED=0
while ss -tlnp 2>/dev/null | grep -q ':8554 ' && [ $WAITED -lt 20 ]; do
    sleep 2
    WAITED=$((WAITED + 2))
    killall -9 mediamtx 2>/dev/null || true
done

if ss -tlnp 2>/dev/null | grep -q ':8554 '; then
    print_error "Порт 8554 не освободился! Попробуйте: sudo reboot"
    exit 1
fi

# --- Удаление старых файлов FFmpeg версии ---
OLD_SERVICE_EXISTS=false
if [ -f "/usr/local/bin/start-ip-camera-restreaming.sh" ]; then
    if grep -q "ffmpeg" "/usr/local/bin/start-ip-camera-restreaming.sh" 2>/dev/null; then
        OLD_SERVICE_EXISTS=true
        echo "  - Обнаружена старая версия (FFmpeg), удаляем..."
    fi
fi

if [ "$OLD_SERVICE_EXISTS" = true ]; then
    rm -f /usr/local/bin/start-ip-camera-restreaming.sh
    rm -rf ${RESTREAMING_DIR}/*.m3u8
    rm -rf ${RESTREAMING_DIR}/*.ts
fi

# --- Удаление старого конфига Nginx ---
rm -f /etc/nginx/sites-available/restreaming
rm -f /etc/nginx/sites-enabled/restreaming

systemctl daemon-reload

print_success "Полная очистка завершена"

################################################################################
# ШАГ 1: ПРОВЕРКА БАЗОВЫХ ПАКЕТОВ
################################################################################

print_header "Шаг 1/9: Проверка базовых пакетов"

if ping -c 1 8.8.8.8 &>/dev/null; then
    echo "Обнаружен интернет, обновляем пакеты..."
    apt update
    apt install -y nginx ufw
else
    echo "Интернет недоступен, пропускаем apt update"
    if ! command -v nginx &>/dev/null; then
        print_error "nginx не установлен!"
        exit 1
    fi
fi

print_success "Базовые пакеты проверены"

################################################################################
# ШАГ 2: УСТАНОВКА MEDIAMTX
################################################################################

print_header "Шаг 2/9: Установка MediaMTX"

if [ ! -f "mediamtx_v1.9.3_linux_amd64.tar.gz" ]; then
    print_error "Архив mediamtx_v1.9.3_linux_amd64.tar.gz не найден!"
    echo "Убедитесь, что файл находится в текущей директории."
    exit 1
fi

echo "Распаковка mediamtx_v1.9.3_linux_amd64.tar.gz..."
tar -xzf mediamtx_v1.9.3_linux_amd64.tar.gz

echo "Копирование бинарника в /usr/local/bin/mediamtx..."
cp mediamtx /usr/local/bin/
chmod +x /usr/local/bin/mediamtx

echo "Очистка временных файлов..."
rm -f mediamtx mediamtx.yml LICENSE README.md

print_success "MediaMTX установлен"

################################################################################
# ШАГ 3: СОЗДАНИЕ ДИРЕКТОРИЙ
################################################################################

print_header "Шаг 3/9: Создание директорий"

mkdir -p /etc/mediamtx
mkdir -p $RESTREAMING_DIR
chown -R root:root $RESTREAMING_DIR
chmod 755 $RESTREAMING_DIR

echo "Директории созданы:"
echo "  - /etc/mediamtx (конфигурация)"
echo "  - $RESTREAMING_DIR (HLS файлы)"

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

################################################################################
# ШАГ 4: СОЗДАНИЕ КОНФИГУРАЦИИ MEDIAMTX
################################################################################

print_header "Шаг 4/9: Создание конфигурации MediaMTX"

cat > /etc/mediamtx/mediamtx.yml << EOF
# MediaMTX Configuration v3.1
# Автоматически сгенерирован установкой

# Общие настройки
logLevel: info
logDestinations: [file]
logFile: /var/log/mediamtx.log

# API для управления
api: yes
apiAddress: 127.0.0.1:9997

# Настройки HLS (5-6 сек задержка + стабильность)
hls: yes
hlsAddress: :8888
hlsEncryption: no
hlsAlwaysRemux: yes
hlsVariant: mpegts
hlsSegmentCount: 3
hlsSegmentDuration: 1s
hlsPartDuration: 500ms
hlsSegmentMaxSize: 50M
hlsDirectory: $RESTREAMING_DIR

# Настройки RTSP
rtspAddress: :8554
protocols: [tcp]
readTimeout: 30s
writeTimeout: 30s

# Источник стрима (камера)
paths:
  camera:
    source: $RTSP_URL
    sourceProtocol: tcp
    sourceOnDemand: no
EOF

print_success "Конфигурация MediaMTX создана: /etc/mediamtx/mediamtx.yml"

################################################################################
# ШАГ 5: НАСТРОЙКА РОТАЦИИ ЛОГОВ
################################################################################

print_header "Шаг 5/9: Настройка ротации логов"

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

cat > /etc/logrotate.d/nginx << 'EOF'
/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` > /dev/null 2>&1 || true
    endscript
}
EOF

print_success "Ротация логов настроена:"
echo "  - MediaMTX: /var/log/mediamtx.log (7 дней)"
echo "  - Nginx: /var/log/nginx/*.log (14 дней)"

################################################################################
# ШАГ 6: СОЗДАНИЕ СКРИПТА ЗАПУСКА
################################################################################

print_header "Шаг 6/9: Создание скрипта запуска"

cat > /usr/local/bin/start-ip-camera-restreaming.sh << 'EOF'
#!/bin/bash
# MediaMTX Wrapper Script v3.1
# Запускает MediaMTX для рестриминга IP-камеры
exec /usr/local/bin/mediamtx /etc/mediamtx/mediamtx.yml
EOF

chmod +x /usr/local/bin/start-ip-camera-restreaming.sh

print_success "Скрипт запуска создан: /usr/local/bin/start-ip-camera-restreaming.sh"

################################################################################
# ШАГ 7: СОЗДАНИЕ SYSTEMD СЕРВИСА
################################################################################

print_header "Шаг 7/9: Создание systemd сервиса"

cat > /etc/systemd/system/ip-camera-restreaming.service << 'EOF'
[Unit]
Description=IP Camera Restreaming Service (MediaMTX v3)
After=network.target
Conflicts=mediamtx.service

[Service]
Type=simple
ExecStart=/usr/local/bin/start-ip-camera-restreaming.sh
Restart=on-failure
RestartSec=30
StartLimitIntervalSec=300
StartLimitBurst=5
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable ip-camera-restreaming.service
systemctl start ip-camera-restreaming.service

echo "Ожидаем запуска MediaMTX..."
sleep 5

if systemctl is-active --quiet ip-camera-restreaming.service; then
    print_success "Сервис ip-camera-restreaming.service запущен и работает"
else
    print_error "Сервис не запустился! Проверьте логи: journalctl -u ip-camera-restreaming.service"
    journalctl -u ip-camera-restreaming.service -n 10 --no-pager
    exit 1
fi

################################################################################
# ШАГ 8: НАСТРОЙКА NGINX
################################################################################

print_header "Шаг 8/9: Настройка Nginx"

cat > /etc/nginx/sites-available/restreaming << 'EOF'
server {
    listen 9999;
    server_name _;
    location / {
        proxy_pass http://127.0.0.1:8888;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}
EOF

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

if nginx -t; then
    systemctl restart nginx
    print_success "Nginx настроен и перезагружен"
else
    print_error "Ошибка в конфигурации Nginx!"
    exit 1
fi

################################################################################
# ШАГ 9: НАСТРОЙКА FIREWALL
################################################################################

print_header "Шаг 9/9: Настройка Firewall"

if command -v ufw &>/dev/null; then
    ufw allow $NGINX_PORT/tcp 2>/dev/null || true
    ufw allow 8888/tcp 2>/dev/null || true
    ufw reload 2>/dev/null || true
    print_success "Firewall: разрешены порты $NGINX_PORT/tcp и 8888/tcp"
else
    print_warning "UFW не установлен, пропускаем настройку firewall"
fi

################################################################################
# ФИНАЛЬНАЯ ПРОВЕРКА И ИНФОРМАЦИЯ
################################################################################

print_header "УСТАНОВКА ЗАВЕРШЕНА"

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

echo ""
echo "=========================================="
echo "           ИНФОРМАЦИЯ О СИСТЕМЕ          "
echo "=========================================="
echo ""
echo "Версия: v3.1 (MediaMTX)"
echo ""
echo "Статус сервиса:"
if systemctl is-active --quiet ip-camera-restreaming.service; then
    echo "  [OK] ip-camera-restreaming.service работает"
else
    echo "  [ERROR] ip-camera-restreaming.service остановлен"
fi
echo ""
echo "URL для просмотра:"
echo "  http://${SERVER_IP}:${NGINX_PORT}/camera/index.m3u8  (через Nginx)"
echo "  http://${SERVER_IP}:8888/camera/index.m3u8  (напрямую MediaMTX)"
echo ""
echo "Логи:"
echo "  sudo tail -f /var/log/mediamtx.log"
echo "  sudo journalctl -u ip-camera-restreaming.service -n 50"
echo ""
echo "Ротация логов:"
echo "  MediaMTX: /var/log/mediamtx.log (7 дней)"
echo "  Nginx: /var/log/nginx/*.log (14 дней)"
echo ""
echo "Команды управления:"
echo "  sudo systemctl status ip-camera-restreaming.service"
echo "  sudo systemctl restart ip-camera-restreaming.service"
echo "  sudo systemctl stop ip-camera-restreaming.service"
echo ""
echo "=========================================="
echo ""
