#!/bin/bash

# Перевірка прав root
if [[ $EUID -ne 0 ]]; then
   echo "Цей скрипт повинен запускатися з правами root"
   exit 1
fi

# Налаштування кольорів для виводу
readonly RED="\033[0;31m"
readonly GREEN="\033[0;32m"
readonly YELLOW="\033[1;33m"
readonly BLUE="\033[0;34m"
readonly RESET="\033[0m"

# Налаштування логування
readonly LOG_FILE="/var/log/lamp-install.log"
exec 1> >(tee -a "$LOG_FILE")
exec 2> >(tee -a "$LOG_FILE" >&2)

# Функція для виводу повідомлень
log() {
    local type=$1
    local message=$2
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    case $type in
        "INFO") echo -e "${BLUE}[INFO]${RESET} ${timestamp} - $message" ;;
        "SUCCESS") echo -e "${GREEN}[SUCCESS]${RESET} ${timestamp} - $message" ;;
        "ERROR") echo -e "${RED}[ERROR]${RESET} ${timestamp} - $message" ;;
        "WARNING") echo -e "${YELLOW}[WARNING]${RESET} ${timestamp} - $message" ;;
    esac
}

# Функція для перевірки успішності виконання команд
check_success() {
    if [ $? -ne 0 ]; then
        log "ERROR" "$1"
        exit 1
    fi
}

# Функція для перевірки доступності порту
check_port() {
    local port=$1
    if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then
        log "WARNING" "Порт $port вже використовується"
        return 1
    fi
    return 0
}

# Функція для створення резервної копії конфігурації
backup_config() {
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local backup_dir="/root/lamp_backup_$timestamp"
    
    log "INFO" "Створення резервної копії конфігурації..."
    mkdir -p "$backup_dir"
    
    [[ -d "/etc/apache2" ]] && cp -r /etc/apache2 "$backup_dir/"
    [[ -d "/etc/mysql" ]] && cp -r /etc/mysql "$backup_dir/"
    [[ -f "/etc/php/*/apache2/php.ini" ]] && cp /etc/php/*/apache2/php.ini "$backup_dir/"
    
    log "SUCCESS" "Резервна копія створена в $backup_dir"
}

# Функція для оптимізації Apache
optimize_apache() {
    log "INFO" "Оптимізація Apache..."
    
    a2enmod expires headers deflate http2
    
    cat > /etc/apache2/mods-available/mpm_event.conf <<EOF
<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         25
    MaxSpareThreads         75
    ThreadLimit            64
    ThreadsPerChild        25
    MaxRequestWorkers     150
    MaxConnectionsPerChild   0
</IfModule>
EOF
    
    a2dismod mpm_prefork
    a2enmod mpm_event
    
    systemctl restart apache2
    check_success "Не вдалося оптимізувати Apache"
}

# Функція для оптимізації MariaDB
optimize_mariadb() {
    log "INFO" "Оптимізація MariaDB..."
    
    cat > /etc/mysql/conf.d/optimizations.cnf <<EOF
[mysqld]
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
key_buffer_size = 32M
max_connections = 100
query_cache_size = 32M
query_cache_limit = 1M
EOF
    
    systemctl restart mariadb
    check_success "Не вдалося оптимізувати MariaDB"
}

# Функція для оптимізації PHP
optimize_php() {
    log "INFO" "Оптимізація PHP..."
    
    PHP_INI=$(php -i | grep "Loaded Configuration File" | awk '{print $5}')
    
    sed -i 's/memory_limit = .*/memory_limit = 256M/' "$PHP_INI"
    sed -i 's/max_execution_time = .*/max_execution_time = 300/' "$PHP_INI"
    sed -i 's/post_max_size = .*/post_max_size = 64M/' "$PHP_INI"
    sed -i 's/upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI"
    sed -i 's/max_input_time = .*/max_input_time = 300/' "$PHP_INI"
    
    cat > /etc/php/*/mods-available/opcache.ini <<EOF
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
EOF
    
    systemctl restart apache2
    check_success "Не вдалося оптимізувати PHP"
}

# Основний код
main() {
    log "INFO" "Початок встановлення LAMP..."
    
    # Створення резервної копії
    backup_config
    
    # Встановлення змінних для уникнення інтерактивних запитів
    export DEBIAN_FRONTEND=noninteractive

    # Генерація паролів
    root_password=$(openssl rand -base64 12)
    phpmyadmin_password=$(openssl rand -base64 12)
    app_password=$(openssl rand -base64 12)

    # Налаштування phpMyAdmin
    debconf-set-selections <<EOF
phpmyadmin phpmyadmin/dbconfig-install boolean true
phpmyadmin phpmyadmin/app-password-confirm password $app_password
phpmyadmin phpmyadmin/mysql/admin-pass password $root_password
phpmyadmin phpmyadmin/mysql/app-pass password $app_password
phpmyadmin phpmyadmin/reconfigure-webserver multiselect apache2
EOF

    # Перевірка портів
    check_port 80 || log "WARNING" "Порт 80 зайнятий"
    check_port 3306 || log "WARNING" "Порт 3306 зайнятий"

    # Оновлення системи
    log "INFO" "Оновлення системи..."
    apt update && apt upgrade -y
    check_success "Не вдалося оновити систему"

    # Встановлення пакетів
    log "INFO" "Встановлення пакетів..."
    apt install -y apache2 mariadb-server mariadb-client php php-mysql php-mbstring php-zip php-gd php-json php-curl phpmyadmin
    check_success "Не вдалося встановити пакети"

    # Запуск сервісів
    systemctl start mariadb apache2
    systemctl enable mariadb apache2

    # Налаштування MariaDB
    mysql -u root <<EOF
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('${root_password}');
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
EOF

    # Створення користувача phpMyAdmin
    mysql -u root -p"${root_password}" <<EOF
CREATE USER IF NOT EXISTS 'admin'@'localhost' IDENTIFIED BY '${phpmyadmin_password}';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EOF

    # Оптимізації
    optimize_apache
    optimize_mariadb
    optimize_php

    # Збереження інформації
    cat > /root/lamp_info.txt <<EOF
Дата встановлення: $(date)
MariaDB root password: ${root_password}
phpMyAdmin admin password: ${phpmyadmin_password}
Лог встановлення: ${LOG_FILE}
EOF
    chmod 600 /root/lamp_info.txt

    log "SUCCESS" "Встановлення LAMP завершено успішно!"
    
    # Вивід інформації
    echo -e "\n${GREEN}=== Інформація про встановлення ===${RESET}"
    echo -e "${BLUE}Логін (phpMyAdmin):${RESET} admin"
    echo -e "${BLUE}Пароль (phpMyAdmin):${RESET} ${GREEN}$phpmyadmin_password${RESET}"
    echo -e "${BLUE}Пароль root (MariaDB):${RESET} ${GREEN}$root_password${RESET}"
    echo -e "${BLUE}Адреса phpMyAdmin:${RESET} http://$(hostname -I | awk '{print $1}')/phpmyadmin"
    echo -e "${YELLOW}Інформація про встановлення збережена в /root/lamp_info.txt${RESET}"
    echo -e "${YELLOW}Лог встановлення доступний в ${LOG_FILE}${RESET}"
}

# Запуск основної функції
main