#!/bin/bash

# Скрипт для установки ClickHouse на Raspberry Pi 5
# Исправленная версия

set -e  # Прерывать выполнение при ошибке

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

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  Установка ClickHouse на Raspberry Pi 5${NC}"
echo -e "${GREEN}========================================${NC}"

# Функция для проверки успешности выполнения
check_success() {
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}✓ $1${NC}"
    else
        echo -e "${RED}✗ $1${NC}"
        exit 1
    fi
}

# Функция для предупреждений
warning() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

# Шаг 1: Обновление системы
echo -e "\n${GREEN}[1/10] Обновление системы...${NC}"
sudo apt update
sudo apt upgrade -y
check_success "Система обновлена"

# Шаг 2: Установка необходимых зависимостей
echo -e "\n${GREEN}[2/10] Установка зависимостей...${NC}"
sudo apt install -y apt-transport-https ca-certificates dirmngr curl wget gnupg
check_success "Зависимости установлены"

# Шаг 3: Добавление официального репозитория ClickHouse
echo -e "\n${GREEN}[3/10] Добавление репозитория ClickHouse...${NC}"
sudo mkdir -p /etc/apt/keyrings
sudo rm -f /etc/apt/keyrings/clickhouse.gpg

# Импортируем ключ во временный keyring, затем экспортируем в правильном формате для sqv
sudo gpg --homedir /tmp --no-default-keyring --keyring /tmp/temp-clickhouse-keyring.gpg --keyserver keyserver.ubuntu.com --recv-keys 8919F6BD2B48D754
sudo gpg --homedir /tmp --no-default-keyring --keyring /tmp/temp-clickhouse-keyring.gpg --export 8919F6BD2B48D754 | sudo tee /etc/apt/keyrings/clickhouse.gpg > /dev/null
sudo chmod 644 /etc/apt/keyrings/clickhouse.gpg
sudo rm -f /tmp/temp-clickhouse-keyring.gpg*
check_success "GPG ключ добавлен"

echo "deb [signed-by=/etc/apt/keyrings/clickhouse.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
check_success "Репозиторий добавлен"

sudo apt update
check_success "Список пакетов обновлен"

# Шаг 4: Установка ClickHouse
echo -e "\n${GREEN}[4/10] Установка ClickHouse...${NC}"
echo -e "${YELLOW}Установка в неинтерактивном режиме (пароль default пользователя будет пустым)${NC}"

# Предварительно отвечаем на запрос пароля (оставляем пустым)
sudo debconf-set-selections <<< "clickhouse-server clickhouse-server/allow_password_empty boolean true"
sudo debconf-set-selections <<< "clickhouse-server clickhouse-server/password password ''"
sudo debconf-set-selections <<< "clickhouse-server clickhouse-server/password_again password ''"

# Устанавливаем в неинтерактивном режиме (не будет запросов)
sudo DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends clickhouse-server clickhouse-client
check_success "ClickHouse установлен"

# Шаг 5: Проверка создания директорий
echo -e "\n${GREEN}[5/10] Проверка и создание директорий...${NC}"

# Создаем все необходимые директории
sudo mkdir -p /etc/clickhouse-server
sudo mkdir -p /etc/clickhouse-server/config.d
sudo mkdir -p /etc/clickhouse-server/users.d
sudo mkdir -p /var/lib/clickhouse
sudo mkdir -p /var/lib/clickhouse/tmp
sudo mkdir -p /var/lib/clickhouse/data
sudo mkdir -p /var/lib/clickhouse/metadata
sudo mkdir -p /var/log/clickhouse-server
sudo mkdir -p /var/run/clickhouse-server
check_success "Директории созданы"

# Шаг 6: Создание конфигурационных файлов
echo -e "\n${GREEN}[6/10] Создание конфигурационных файлов...${NC}"

# Создаем основной конфиг config.xml
sudo tee /etc/clickhouse-server/config.xml > /dev/null << 'EOF'
<clickhouse>
    <logger>
        <level>trace</level>
        <log>/var/log/clickhouse-server/clickhouse-server.log</log>
        <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
        <size>1000M</size>
        <count>10</count>
    </logger>
    <http_port>8123</http_port>
    <tcp_port>9000</tcp_port>
    <listen_host>127.0.0.1</listen_host>
    <max_connections>4096</max_connections>
    <keep_alive_timeout>3</keep_alive_timeout>
    <path>/var/lib/clickhouse/</path>
    <tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
    <user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
    <users_config>users.xml</users_config>
    <default_profile>default</default_profile>
    <default_database>default</default_database>
    <timezone>Europe/Moscow</timezone>
    <mlock_executable>true</mlock_executable>
</clickhouse>
EOF
check_success "Основной конфиг создан"

# Создаем конфиг пользователей users.xml
sudo tee /etc/clickhouse-server/users.xml > /dev/null << 'EOF'
<clickhouse>
    <profiles>
        <default>
            <max_memory_usage>10000000000</max_memory_usage>
            <load_balancing>random</load_balancing>
        </default>
    </profiles>
    <users>
        <default>
            <password></password>
            <networks>
                <ip>::/0</ip>
            </networks>
            <profile>default</profile>
            <quota>default</quota>
        </default>
    </users>
    <quotas>
        <default>
            <interval>
                <duration>3600</duration>
                <queries>0</queries>
                <errors>0</errors>
                <result_rows>0</result_rows>
                <read_rows>0</read_rows>
                <execution_time>0</execution_time>
            </interval>
        </default>
    </quotas>
</clickhouse>
EOF
check_success "Конфиг пользователей создан"

# Настройка сети - слушаем все интерфейсы
sudo tee /etc/clickhouse-server/config.d/network.xml > /dev/null << 'EOF'
<clickhouse>
    <listen_host>0.0.0.0</listen_host>
</clickhouse>
EOF
check_success "Сетевой конфиг создан"

# Шаг 7: Установка прав
echo -e "\n${GREEN}[7/10] Настройка прав доступа...${NC}"

# Проверяем существование пользователя и группы
if ! id -u clickhouse > /dev/null 2>&1; then
    sudo useradd -r --shell /bin/false -U clickhouse
fi

# Устанавливаем права
sudo chown -R clickhouse:clickhouse /etc/clickhouse-server
sudo chown -R clickhouse:clickhouse /var/lib/clickhouse
sudo chown -R clickhouse:clickhouse /var/log/clickhouse-server
sudo chown -R clickhouse:clickhouse /var/run/clickhouse-server

sudo chmod 755 /etc/clickhouse-server
sudo chmod 644 /etc/clickhouse-server/*.xml
sudo chmod 755 /etc/clickhouse-server/config.d
sudo chmod 644 /etc/clickhouse-server/config.d/*.xml
sudo chmod 755 /etc/clickhouse-server/users.d
sudo chmod 755 /var/lib/clickhouse
sudo chmod 755 /var/log/clickhouse-server
sudo chmod 755 /var/run/clickhouse-server
check_success "Права доступа настроены"

# Шаг 8: Исправление systemd unit файла
echo -e "\n${GREEN}[8/10] Настройка systemd сервиса...${NC}"

# Создаем исправленный unit файл
sudo tee /lib/systemd/system/clickhouse-server.service > /dev/null << 'EOF'
[Unit]
Description=ClickHouse Server (analytic DBMS for big data)
After=network.target

[Service]
Type=simple
User=clickhouse
Group=clickhouse
RuntimeDirectory=clickhouse-server
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
Restart=always
RestartSec=30
LimitNOFILE=262144
LimitNPROC=131072
TasksMax=infinity

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
check_success "Systemd unit файл настроен"

# Шаг 9: Запуск сервера
echo -e "\n${GREEN}[9/10] Запуск ClickHouse сервера...${NC}"

# Создаем файлы логов с правильными правами (критично для первого запуска)
sudo touch /var/log/clickhouse-server/clickhouse-server.log
sudo touch /var/log/clickhouse-server/clickhouse-server.err.log
sudo chown clickhouse:clickhouse /var/log/clickhouse-server/clickhouse-server.log
sudo chown clickhouse:clickhouse /var/log/clickhouse-server/clickhouse-server.err.log
sudo chmod 644 /var/log/clickhouse-server/clickhouse-server.log
sudo chmod 644 /var/log/clickhouse-server/clickhouse-server.err.log

# Очищаем старые логи если есть
sudo truncate -s 0 /var/log/clickhouse-server/clickhouse-server.log 2>/dev/null || true
sudo truncate -s 0 /var/log/clickhouse-server/clickhouse-server.err.log 2>/dev/null || true

# Запускаем сервер
sudo systemctl start clickhouse-server
sleep 5

# Проверка статуса
if sudo systemctl is-active --quiet clickhouse-server; then
    echo -e "${GREEN}✓ Сервер успешно запущен${NC}"
else
    echo -e "${RED}✗ Ошибка запуска сервера${NC}"
    echo -e "${YELLOW}Проверяем логи...${NC}"
    sudo journalctl -xeu clickhouse-server.service | tail -30
    echo -e "${YELLOW}Запускаем вручную для диагностики:${NC}"
    sudo -u clickhouse /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
    exit 1
fi

sudo systemctl enable clickhouse-server > /dev/null 2>&1
check_success "Автозапуск включен"

# Шаг 10: Проверка подключения
echo -e "\n${GREEN}[10/10] Проверка подключения к ClickHouse...${NC}"
sleep 3

# Проверяем, что порты слушаются
if sudo ss -tlnp | grep -q 9000; then
    echo -e "${GREEN}✓ Порт 9000 (TCP) слушается${NC}"
else
    echo -e "${RED}✗ Порт 9000 не слушается${NC}"
fi

if sudo ss -tlnp | grep -q 8123; then
    echo -e "${GREEN}✓ Порт 8123 (HTTP) слушается${NC}"
else
    echo -e "${RED}✗ Порт 8123 не слушается${NC}"
fi

# Пробуем подключиться
if echo "SELECT 1;" | timeout 5 clickhouse-client 2>/dev/null | grep -q "1"; then
    echo -e "${GREEN}✓ Подключение к ClickHouse успешно!${NC}"
else
    warning "Автоматическая проверка не удалась, проверьте статус сервера"
fi

# Дополнительная настройка: отключение предупреждения о delay accounting
echo -e "\n${GREEN}[Дополнительно] Настройка системы...${NC}"
echo "kernel.task_delayacct = 1" | sudo tee -a /etc/sysctl.conf > /dev/null 2>&1 || true
sudo sysctl -w kernel.task_delayacct=1 > /dev/null 2>&1 || true
check_success "Delay accounting настроен (опционально)"

# Информация о установке
echo -e "\n${GREEN}========================================${NC}"
echo -e "${GREEN}  Установка ClickHouse завершена успешно!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""

# Получаем IP адрес
IP_ADDR=$(ip addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '127.0.0.1' | head -1)
echo -e "🌐 ${YELLOW}IP адрес Raspberry Pi:${NC} $IP_ADDR"
echo ""

echo -e "${YELLOW}Команды для проверки:${NC}"
echo "   Локально:    clickhouse-client"
echo "   Удаленно:    clickhouse-client -h $IP_ADDR"
echo "   HTTP запрос: curl 'http://$IP_ADDR:8123/?query=SELECT%20version()'"
echo ""

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}  Готово! ClickHouse работает на Raspberry Pi 5${NC}"
echo -e "${GREEN}========================================${NC}"