#!/bin/bash

set -e  # Останавливаем скрипт при любой ошибке

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

echo -e "${GREEN}=== Настройка geo-файлов для remnanode ===${NC}"

# 1. Создаем директорию для geo-файлов
echo -e "${YELLOW}1. Создаю директорию /opt/geofiles...${NC}"
mkdir -p /opt/geofiles

# 2. Скачиваем файлы
echo -e "${YELLOW}2. Скачиваю geo-файлы...${NC}"
cd /opt/geofiles

echo "   Скачиваю geosite.dat..."
wget -q --show-progress https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat

echo "   Скачиваю geoip.dat..."
wget -q --show-progress https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat

# Проверяем, что файлы скачались
if [[ -f "geosite.dat" && -f "geoip.dat" ]]; then
    echo -e "${GREEN}   ✓ Файлы успешно скачаны${NC}"
else
    echo -e "${RED}   ✗ Ошибка: не удалось скачать файлы${NC}"
    exit 1
fi

# 3. Редактируем docker-compose.yml
echo -e "${YELLOW}3. Редактирую docker-compose.yml...${NC}"

# Создаем резервную копию
cp /opt/docker-compose.yml /opt/docker-compose.yml.backup.$(date +%Y%m%d_%H%M%S)

# Используем Python для точного добавления volumes
python3 << 'PYTHON_SCRIPT'
import re

with open('/opt/docker-compose.yml', 'r') as f:
    lines = f.readlines()

new_volumes = [
    "      - '/opt/geofiles/geoip.dat:/usr/local/share/xray/geoip.dat'\n",
    "      - '/opt/geofiles/geosite.dat:/usr/local/share/xray/geosite.dat'\n"
]

result = []
in_remnanode = False
in_volumes = False
volumes_added = False

for i, line in enumerate(lines):
    # Начало секции remnanode
    if re.match(r'^  remnanode:', line):
        in_remnanode = True
        result.append(line)
        continue
    
    # Нашли секцию volumes внутри remnanode
    if in_remnanode and re.match(r'^    volumes:', line):
        in_volumes = True
        result.append(line)
        continue
    
    # Добавляем новые volumes в конец списка
    if in_remnanode and in_volumes and not volumes_added:
        if re.match(r'^      - ', line):
            result.append(line)
            # Проверяем следующую строку
            if i+1 < len(lines):
                next_line = lines[i+1]
                if not re.match(r'^      - ', next_line):
                    result.extend(new_volumes)
                    volumes_added = True
            continue
        elif line.strip() == '' or re.match(r'^    [a-z]', line):
            if not volumes_added:
                result.extend(new_volumes)
                volumes_added = True
            in_volumes = False
            in_remnanode = False
            result.append(line)
            continue
    
    # Выход из секции remnanode
    if in_remnanode and re.match(r'^  [a-z]', line) and not re.match(r'^  remnanode:', line):
        in_remnanode = False
        in_volumes = False
    
    result.append(line)

with open('/opt/docker-compose.yml', 'w') as f:
    f.writelines(result)

print("   ✓ docker-compose.yml обновлен")
PYTHON_SCRIPT

# 4. Создаем скрипт для ежедневного обновления в /opt/geofiles
echo -e "${YELLOW}4. Создаю скрипт автоматического обновления в /opt/geofiles...${NC}"

cat > /opt/geofiles/update_geofiles.sh << 'EOF'
#!/bin/bash

# Директория с geo-файлами
GEO_DIR="/opt/geofiles"
LOG_FILE="/opt/log/geofiles_update.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] Начинаю обновление geo-файлов..." >> $LOG_FILE

cd $GEO_DIR

# Функция для проверки и обновления файлов
update_file() {
    local file=$1
    local url=$2
    
    if wget -q "$url" -O "${file}.new"; then
        if [ -f "$file" ]; then
            if ! cmp -s "$file" "${file}.new"; then
                mv "${file}.new" "$file"
                echo "[$DATE] ✓ $file обновлен (файл изменился)" >> $LOG_FILE
                return 0
            else
                rm "${file}.new"
                echo "[$DATE] $file актуален" >> $LOG_FILE
                return 1
            fi
        else
            mv "${file}.new" "$file"
            echo "[$DATE] ✓ $file создан" >> $LOG_FILE
            return 0
        fi
    else
        echo "[$DATE] ✗ Ошибка при обновлении $file" >> $LOG_FILE
        rm -f "${file}.new"
        return 1
    fi
}

NEED_RESTART=false

# Обновляем файлы
if update_file "geosite.dat" "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"; then
    NEED_RESTART=true
fi

if update_file "geoip.dat" "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"; then
    NEED_RESTART=true
fi

# Перезапускаем контейнер только если были изменения
if [ "$NEED_RESTART" = true ]; then
    cd /opt && docker compose restart remnanode >> $LOG_FILE 2>&1
    echo "[$DATE] ✓ Контейнер remnanode перезапущен" >> $LOG_FILE
else
    echo "[$DATE] Обновления не требуются" >> $LOG_FILE
fi

echo "[$DATE] Проверка завершена" >> $LOG_FILE
echo "----------------------------------------" >> $LOG_FILE

# Очищаем лог-файлы старше 30 дней
find /opt/log -name "geofiles_update.log" -mtime +30 -delete 2>/dev/null
EOF

chmod +x /opt/geofiles/update_geofiles.sh
mkdir -p /opt/log

echo -e "${GREEN}   ✓ Скрипт обновления создан: /opt/geofiles/update_geofiles.sh${NC}"

# 5. Создаем systemd таймер
echo -e "${YELLOW}5. Создаю systemd таймер для ежедневного обновления в 3:00...${NC}"

# Создаем systemd сервис
cat > /etc/systemd/system/update-geofiles.service << EOF
[Unit]
Description=Update geofiles for remnanode
After=network.target docker.service
Requires=docker.service

[Service]
Type=oneshot
ExecStart=/opt/geofiles/update_geofiles.sh
User=root
StandardOutput=journal
StandardError=journal
EOF

# Создаем systemd таймер
cat > /etc/systemd/system/update-geofiles.timer << 'EOF'
[Unit]
Description=Run geofiles update daily at 3 AM
Requires=update-geofiles.service

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

# Перезагружаем systemd и активируем таймер
systemctl daemon-reload
systemctl enable update-geofiles.timer
systemctl start update-geofiles.timer

echo -e "${GREEN}   ✓ Systemd таймер создан и запущен${NC}"

# 6. Перезапускаем docker compose
echo -e "${YELLOW}6. Перезапускаю docker compose...${NC}"
cd /opt
docker compose down
docker compose up -d

echo -e "${GREEN}✓ Контейнеры перезапущены${NC}"

# 7. Выводим информацию
echo ""
echo -e "${GREEN}=== НАСТРОЙКА ЗАВЕРШЕНА ===${NC}"
echo ""
echo -e "${GREEN}✓ Geo-файлы установлены в /opt/geofiles/${NC}"
echo -e "${GREEN}✓ Docker Compose обновлен${NC}"
echo -e "${GREEN}✓ Контейнеры перезапущены${NC}"
echo -e "${GREEN}✓ Таймер настроен на ежедневное обновление в 3:00${NC}"
echo ""
echo -e "${YELLOW}Полезные команды:${NC}"
echo "  Просмотр статуса таймера: systemctl status update-geofiles.timer"
echo "  Ручной запуск обновления: /opt/geofiles/update_geofiles.sh"
echo "  Или через systemd:        systemctl start update-geofiles.service"
echo "  Просмотр лога обновлений: tail -f /opt/log/geofiles_update.log"
echo "  Отключение автообновления: systemctl disable --now update-geofiles.timer"
echo ""
echo -e "${YELLOW}Ближайшее время обновления:${NC}"
systemctl list-timers update-geofiles.timer --no-pager -l
