#!/usr/bin/env bash
set -e

# Полностью неинтерактивный режим apt:
# - DEBIAN_FRONTEND=noninteractive отключает все TUI-промпты (debconf, dialog).
# - --force-confold сохраняет существующие конфиги (например, initramfs.conf),
#   --force-confdef использует default из пакета если нет старой версии.
# Без этого apt upgrade/install зависают на conffile-вопросах вроде initramfs.
export DEBIAN_FRONTEND=noninteractive
APT_INSTALL_OPTS=(
    -y
    --no-install-recommends
    -o "Dpkg::Options::=--force-confold"
    -o "Dpkg::Options::=--force-confdef"
)
apt_install() {
    sudo -E apt-get install "${APT_INSTALL_OPTS[@]}" "$@"
}
apt_update() {
    sudo -E apt-get update -y
}

# Параметры
UMHOST_BINARY_URL="https://filesmanager.umhost.io/a_agent/umhost-linux-arm64"
# ↑ Ссылка на бинарь Umhost.
UMHOST_BINARY_LOCAL_PATH="/etc/umhost/umhost-linux-arm64"

UMHOST_UNINSTALL_SH_URL="https://filesmanager.umhost.io/a_agent/uninstall_umhost.sh"
# ↑ Ссылка на файл для удаления Umhost.
UMHOST_UNINSTALL_SH_LOCAL_PATH="/etc/umhost/uninstall_umhost.sh"

UMHOST_UPDATE_SH_URL="https://filesmanager.umhost.io/a_agent/update_umhost.sh"
# ↑ Ссылка на файл для обновления Umhost.
UMHOST_UPDATE_SH_LOCAL_PATH="/etc/umhost/update_umhost.sh"

SUPERVISOR_CONFIG_PATH="/etc/supervisor/conf.d/umhost.conf"

# Pin ClickHouse на 22.8.21.38 — последняя протестированная версия, которая запускается
# на Cortex-A76 (Raspberry Pi 5). Начиная с 23.8 ClickHouse подключил SIMD-инструкции
# (SVE, BF16, I8MM), которых в A76 нет → бинарник падает с SIGILL ("Illegal instruction").
# LTS-репо держит несколько мажоров одновременно, поэтому 22.8 всё ещё доступна.
CLICKHOUSE_VERSION="22.8.21.38"

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

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}"
}

# =============================================================================
# Встроенная логика: install_clickhouse_rpi5.sh
# =============================================================================
install_clickhouse_rpi5() {
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  Установка ClickHouse на Raspberry Pi 5${NC}"
    echo -e "${GREEN}========================================${NC}"

    # Шаг 1: Обновление списка пакетов (без apt upgrade — не хотим затягивать
    # установку обновлением всего дистрибутива и ловить conffile-промпты).
    echo -e "\n${GREEN}[1/10] Обновление списка пакетов...${NC}"
    apt_update
    check_success "Список пакетов обновлён"

    # Шаг 2: Установка необходимых зависимостей
    echo -e "\n${GREEN}[2/10] Установка зависимостей...${NC}"
    apt_install 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

    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 ключ добавлен"

    # LTS-ветка (а не stable=latest), потому что свежие версии ClickHouse (25+/26+)
    # используют SIMD-инструкции, которых нет в Cortex-A76 (Raspberry Pi 5) — бинарник
    # падает с SIGILL ("Illegal instruction") при первом же запуске postinst-скриптом.
    # LTS собирается под более широкий набор CPU и работает на Pi 5.
    echo "deb [signed-by=/etc/apt/keyrings/clickhouse.gpg] https://packages.clickhouse.com/deb lts main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
    check_success "Репозиторий добавлен (LTS-ветка)"

    apt_update
    check_success "Список пакетов обновлен"

    # Шаг 3.5: Идемпотентная установка ClickHouse pinned-версии.
    # - Если уже стоит ровно $CLICKHOUSE_VERSION — ничего не делаем (не теряем данные).
    # - Если стоит другая (например битая 26.x) — purge + remove data + переустановка.
    # - Если не стоит — просто ставим.
    echo -e "\n${GREEN}[3.5/10] Проверка существующей установки ClickHouse...${NC}"
    CH_INSTALLED_VERSION=$(dpkg-query -W -f='${Version}' clickhouse-server 2>/dev/null || echo "")
    SKIP_CH_INSTALL=0
    if [[ "$CH_INSTALLED_VERSION" == "$CLICKHOUSE_VERSION" ]]; then
        echo -e "${GREEN}✓ ClickHouse $CLICKHOUSE_VERSION уже установлен корректно — пропускаем переустановку${NC}"
        SKIP_CH_INSTALL=1
    elif [[ -n "$CH_INSTALLED_VERSION" ]]; then
        echo -e "${YELLOW}Установлена несовместимая версия ($CH_INSTALLED_VERSION), нужна $CLICKHOUSE_VERSION — переустанавливаем${NC}"
        sudo systemctl stop clickhouse-server 2>/dev/null || true
        sudo systemctl disable clickhouse-server 2>/dev/null || true
        sudo apt-mark unhold clickhouse-server clickhouse-client clickhouse-common-static 2>/dev/null || true
        sudo -E apt-get purge -y clickhouse-server clickhouse-client clickhouse-common-static 2>/dev/null || true
        sudo -E apt-get autoremove -y 2>/dev/null || true
        sudo rm -rf /var/lib/clickhouse /var/log/clickhouse-server /etc/clickhouse-server
        check_success "Старая установка ClickHouse удалена"
    else
        echo -e "${GREEN}✓ ClickHouse не установлен — будет установлен с нуля${NC}"
    fi

    # Шаг 4: Установка ClickHouse pinned-версии
    if [[ "$SKIP_CH_INSTALL" != "1" ]]; then
        echo -e "\n${GREEN}[4/10] Установка ClickHouse $CLICKHOUSE_VERSION...${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 ''"

        apt_install \
            clickhouse-server=${CLICKHOUSE_VERSION} \
            clickhouse-client=${CLICKHOUSE_VERSION} \
            clickhouse-common-static=${CLICKHOUSE_VERSION}
        check_success "ClickHouse $CLICKHOUSE_VERSION установлен"

        # Защита от случайного `apt upgrade` — иначе apt подтянет 26.x с SIGILL обратно.
        sudo apt-mark hold clickhouse-server clickhouse-client clickhouse-common-static
        check_success "ClickHouse зафиксирован на $CLICKHOUSE_VERSION (apt-mark hold)"
    else
        echo -e "\n${GREEN}[4/10] Установка ClickHouse пропущена (уже стоит $CLICKHOUSE_VERSION)${NC}"
    fi

    # Шаг 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}"

    sudo tee /etc/clickhouse-server/config.xml > /dev/null << 'CH_CONFIG_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>
CH_CONFIG_EOF
    check_success "Основной конфиг создан"

    sudo tee /etc/clickhouse-server/users.xml > /dev/null << 'CH_USERS_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>
CH_USERS_EOF
    check_success "Конфиг пользователей создан"

    sudo tee /etc/clickhouse-server/config.d/network.xml > /dev/null << 'CH_NETWORK_EOF'
<clickhouse>
    <listen_host>0.0.0.0</listen_host>
</clickhouse>
CH_NETWORK_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}"

    sudo tee /lib/systemd/system/clickhouse-server.service > /dev/null << 'CH_SYSTEMD_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
CH_SYSTEMD_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

    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}"
}

# =============================================================================
# Встроенная логика: fix_clickhouse_permissions.sh
# =============================================================================
fix_clickhouse_permissions() {
    echo "Исправление прав доступа для ClickHouse..."

    sudo systemctl stop clickhouse-server 2>/dev/null || true

    if ! id -u clickhouse > /dev/null 2>&1; then
        sudo useradd -r --shell /bin/false -U clickhouse
    fi

    for dir in /etc/clickhouse-server /var/lib/clickhouse /var/log/clickhouse-server /var/run/clickhouse-server; do
        sudo mkdir -p $dir
        sudo chown -R clickhouse:clickhouse $dir
        sudo chmod 755 $dir
    done

    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 chown clickhouse:clickhouse /etc/clickhouse-server/*.xml
    sudo chmod 644 /etc/clickhouse-server/*.xml

    sudo systemctl start clickhouse-server
    sleep 3

    sudo systemctl status clickhouse-server --no-pager || true

    echo "Готово!"
}

# =============================================================================
# Установка Umhost
# =============================================================================

# 1. Обновляем списки пакетов и устанавливаем Redis
echo ">>> Обновляем apt и устанавливаем Redis..."
apt_update
apt_install redis-server

# Включаем и запускаем Redis (если не запущен)
sudo systemctl enable redis-server
sudo systemctl start redis-server

# 2. Устанавливаем Supervisor
echo ">>> Устанавливаем Supervisor..."
apt_install supervisor

# 3. Создаём рабочую директорию для Umhost
echo ">>> Создаём директорию /etc/umhost (если отсутствует)..."
sudo mkdir -p /etc/umhost

# 4. Устанавливаем ClickHouse (встроенная логика)
echo ">>> Устанавливаем ClickHouse..."
install_clickhouse_rpi5

# 5. Скачиваем бинарь Umhost
echo ">>> Скачиваем Umhost..."
sudo curl -L -o "$UMHOST_BINARY_LOCAL_PATH" "$UMHOST_BINARY_URL"

# 6. Даем права на исполнение бинарю Umhost
echo ">>> Делаем Umhost исполняемым..."
sudo chmod +x "$UMHOST_BINARY_LOCAL_PATH"

# 7. Скачиваем uninstall скрипт Umhost
echo ">>> Скачиваем Umhost Uninstall скрипт..."
sudo curl -L -o "$UMHOST_UNINSTALL_SH_LOCAL_PATH" "$UMHOST_UNINSTALL_SH_URL"

# 8. Даем права на исполнение uninstall скрипта Umhost
echo ">>> Делаем Umhost Uninstall скрипт исполняемым..."
sudo chmod +x "$UMHOST_UNINSTALL_SH_LOCAL_PATH"

# 9. Скачиваем update скрипт Umhost
echo ">>> Скачиваем Umhost Update скрипт..."
sudo curl -L -o "$UMHOST_UPDATE_SH_LOCAL_PATH" "$UMHOST_UPDATE_SH_URL"

# 10. Даем права на исполнение update скрипта Umhost
echo ">>> Делаем Umhost Update скрипт исполняемым..."
sudo chmod +x "$UMHOST_UPDATE_SH_LOCAL_PATH"

# 11. Создаём конфигурационный файл Supervisor для Umhost с флагом --auto
echo ">>> Создаём конфигурацию Supervisor для Umhost..."
sudo bash -c "cat > $SUPERVISOR_CONFIG_PATH" <<EOF
[program:umhost]
command=$UMHOST_BINARY_LOCAL_PATH
autostart=true
autorestart=true
stderr_logfile=/var/log/umhost.err.log
stdout_logfile=/var/log/umhost.out.log
minfds=65535
EOF

# 12. Перезагружаем конфигурацию Supervisor и запускаем Umhost
# Лимит файловых дескрипторов уже выставлен в supervisor конфиге через minfds=65535,
# отдельная команда `sudo ulimit` бессмысленна — ulimit это shell builtin, через sudo не работает.
echo ">>> Перезагружаем конфигурацию Supervisor и запускаем Umhost..."
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl restart umhost
sudo supervisorctl status umhost

echo ">>> Установка Umhost завершена!"
