#!/bin/bash

TYPE_INSTALL=${1:-mono} # split - раздельная установка с БД, mono - совместная установка
UPDATE=${2:-false} # true - обновление, false - установка (отличаются тем, что при обновлении не добавляются репозитории)


PACKAGES_VERSION_CONF="/tmp/packages_version.conf"

declare -A specificModules
specificModules[mono]="artixcs-rest-lib artixcs-rest artix-python314 artix-cs-nes artix-cs-exchangers artixcs-config"
specificModules[split]="artix-python314 artixcs-rest-split"

declare -A PACKAGES_VERSION

# Загружаем конфигурацию пакетов
if [[ -f "$PACKAGES_VERSION_CONF" ]]; then
    while IFS='=' read -r pkg ver; do
        [[ -z "$pkg" || "$pkg" == \#* ]] && continue
        PACKAGES_VERSION[$pkg]=$ver
    done < "$PACKAGES_VERSION_CONF"
fi

check_last_build_date() {
  # с 01.02.2026 перед установкой проверяем дату обновления, разрешенную в лицензии
  local LICENCE_FILE_PATH="/opt/artixcs-rest/licence/licence.li4"
  local START_LICENCE_CHECK_DATE=$(date -d '2026-02-01' +%s)
  local CURRENT_DATE=$(date +%s)
  local NC='\033[0m' # No Color
  local RED='\033[31m'
  local YELLOW='\033[33m'

  if [ -f $LICENCE_FILE_PATH ]; then
    if [ $CURRENT_DATE -gt $START_LICENCE_CHECK_DATE ] || [ $CURRENT_DATE -eq $START_LICENCE_CHECK_DATE ]; then
      # убедимся, что пакет jq есть в системе
      if ! dpkg-query -W -f='${Status}' jq 2>/dev/null | grep -q "ok installed"; then
        apt-get install -y jq
      fi

      echo -e "${YELLOW}Проверка файла лицензии${NC}"

      actualBuildDate=$(apt-cache show --no-all-versions artixcs-rest | grep Build-Date | awk '{print $2}')
      echo "Дата сборки пакета artixcs-rest: $actualBuildDate"
      if [ -z "$actualBuildDate" ]; then
        echo -e "${YELLOW}Дата сборки artixcs-rest неизвестна. После установки сервис может работать некорректно${NC}"
        return
      fi
      # эта штука может выбросить ошибку парсинга, но дату обычно возвращает, так что ошибку парсинга можно игнорировать, но лучше не использовать set -e
      lastBuildDate=$(jq -r 'first(.[] | select(.product=="CONTROL_CENTER" or .product=="CONTROL_CENTER_CCS" or .product=="CONTROL_CENTER_MCS")) | .lastBuildDate' $LICENCE_FILE_PATH)
      echo "Дата, до которой доступно обновление: $lastBuildDate"
      if [ -z "$lastBuildDate" ]; then
        echo -e "${YELLOW}Дата последнего доступного обновления неизвестна. После установки сервис может работать некорректно${NC}"
        return
      fi

      lastBuildDateTstmp=$(date -d "$lastBuildDate" +%s)
      actualBuildDateTstmp=$(date -d "$actualBuildDate" +%s)

      version=$(apt-cache show --no-all-versions artixcs-rest | grep Version | awk '{print $2}')

      if [ $actualBuildDateTstmp -gt $lastBuildDateTstmp ]; then
        echo -e "${RED}Обновление ${version} не может быть установлено. Дата крайнего релиза, доступного Вам, ограничена файлом лицензии и не может быть > ${lastBuildDate}${NC}"
        exit 1
      fi

    fi
  else
    echo -e "${YELLOW}Файл лицензии не найден${NC}"
  fi
}

install_all_packages_with_versions() {
    local packages_to_install=()

    for pkg in "$@"; do
        local version=${PACKAGES_VERSION[$pkg]}
        if [[ -n "$version" ]]; then
            if apt-cache policy "$pkg" | grep -F " $version " > /dev/null; then
                packages_to_install+=("${pkg}=${version}")
            else
                echo "Version $version for $pkg not found. Skipping."
            fi
        else
            packages_to_install+=("$pkg")
        fi
    done

    if [[ ${#packages_to_install[@]} -gt 0 ]]; then
        echo "Installing packages: ${packages_to_install[*]}"
        apt-get install -y --allow-downgrades "${packages_to_install[@]}"
    else
        echo "No valid packages to install."
    fi
}

if [[ ${TYPE_INSTALL} == 'mono' ]]; then
    # считаем что нет необходимости задавать пароль для внутреннего пользователя mysql
    echo "===========debconf running=========================================="
    echo "artixcs-config acc/mysqlpassword password root" | debconf-set-selections
    # для mysql8
    echo "mysql-community-server mysql-community-server/root-pass password root" | debconf-set-selections
    echo "mysql-community-server mysql-community-server/re-root-pass password root" | debconf-set-selections 
    echo "mysql-community-server mysql-server/default-auth-override select Use Strong Password Encryption (RECOMMENDED)" | debconf-set-selections
    # для mysql5
    echo "mysql-server mysql-server/root_password password root" | debconf-set-selections
    echo "mysql-server mysql-server/root_password_again password root" | debconf-set-selections
fi

find /etc/apt/sources.list.d -type f -exec sed -i 's/http:\/\/update.artix.su/https:\/\/update.artix.su/g' {} \;

apt-get update
# эту штуку вызывать после обновления индексов
check_last_build_date

apt-get install -y unzip mc java-artix java-11-artix

install_all_packages_with_versions artixcs-apt-config

install_all_packages_with_versions ${specificModules[${TYPE_INSTALL}]}

install_all_packages_with_versions artixcs-puppet-objects

# для ubuntu 18 необходимо добавление mongod в автозапуск
if type systemctl > /dev/null 2>&1 && [[ ${TYPE_INSTALL} == 'mono' ]] && [[ ${UPDATE} == false ]]; then 
    systemctl enable mongod
    systemctl restart mongod
fi

# перечислен большой список пакетов, необходимо для поведения нашего скрипта update,
# если происходит обновление зависимого пакета, и он не прописан в списке, при вызове он не будет обновлен (по нормальному корневой пакет должен ссылаться на обновленную версию)
install_all_packages_with_versions artixcs-controlcenter artixcs-sales-rest-lib artixcs-sales-rest artixcs-report-lib artixcs-report artixcs-processed artixcs-sales-loader artixcs-discovery

# устанавливаем artixcs-controlcenter-5 если он есть в репозитории
if apt show artixcs-controlcenter-5 > /dev/null 2> /dev/null; then
    install_all_packages_with_versions artixcs-controlcenter-5
fi

SALE_RENDERER_CONFIG_FILE=/opt/artixcs-sale-renderer/config.json

if dpkg -l | grep -q "artixcs-sale-renderer"; then
    mv $SALE_RENDERER_CONFIG_FILE /opt/configBackup.json

    # удаляем устаревшие пакеты
    apt-get remove -y artixcs-sale-renderer-additional-ui || true
    apt-get remove -y artixcs-sale-renderer || true

    rm -r /opt/artixcs-sale-renderer/* || true
    mkdir -p /opt/artixcs-sale-renderer
    mv /opt/configBackup.json $SALE_RENDERER_CONFIG_FILE
fi

# создаем дефолтный файл конфигурации для sale-renderer, если его нет
if ! test -f $SALE_RENDERER_CONFIG_FILE; then
    mkdir -p /opt/artixcs-sale-renderer
    echo -e '{\n\t"CS_SERVER_HOST" : "localhost",\n\t"CS_SERVER_PORT" : "38051",\n\t"SR_PORT" : "38067"\n}' > $SALE_RENDERER_CONFIG_FILE
fi

# проверяем наличие ротации логов mysql и mongodb. Если нет - добавляем
if ! grep -R "/etc/logrotate.d/" -q -e "/var/log/mysql/\*log"; then
    echo -e "/var/log/mysql/*log {\n\trotate 14\n\tdaily\n\tmissingok\n\tnotifempty\n\tdelaycompress\n\tcompress\n}" > /etc/logrotate.d/mysql
    logrotate -f /etc/logrotate.d/mysql
fi
if ! grep -R "/etc/logrotate.d/" -q -e "/var/log/mongodb/\*.log"; then
    echo -e "/var/log/mongodb/*.log {\n\trotate 14\n\tdaily\n\tmissingok\n\tnotifempty\n\tdelaycompress\n\tcompress\n}" > /etc/logrotate.d/mongodb
    logrotate -f /etc/logrotate.d/mongodb
fi