#!/bin/bash

INSTALL_TYPE='install'
title_count=1

CURRENT_DIR=$(
    cd "$(dirname "$0")"
    pwd
)

function log() {
    echo -e "${1}" 2>&1 | tee -a ${CURRENT_DIR}/install.log
}

function log_title () {
    log "${title_count}. ${1}"
    let title_count++
}

function log_content () {
    log "\t${1}"
}

function check_and_prepare_env_params() {
    log "当前时间 : $(date)"
    log_title "检查安装环境并初始化环境变量"

    cd ${CURRENT_DIR}
    if [ -f /usr/bin/sctl ]; then
        echo "当前版本： $(sctl version | head -n 1)"

        # 获取已安装的 SQLBOT 的运行目录
        SQLBOT_BASE=$(grep "^SQLBOT_BASE=" /usr/bin/sctl | cut -d'=' -f2)
        SQLBOT_BASE_OLD=${SQLBOT_BASE}
        sed -i -e "s#SQLBOT_BASE=.*#SQLBOT_BASE=${SQLBOT_BASE}#g" sctl
        \cp sctl /usr/local/bin && chmod +x /usr/local/bin/sctl

        log_content "停止 SQLBot 服务"
        sctl stop

        INSTALL_TYPE='upgrade'
    fi

    set -a
    source ${CURRENT_DIR}/install.conf
    if [[ ${SQLBOT_BASE_OLD} ]];then
        SQLBOT_BASE=${SQLBOT_BASE_OLD}
        export SQLBOT_BASE=${SQLBOT_BASE_OLD}
    fi
    if [[ -d ${SQLBOT_BASE} ]] && [[ -f ${SQLBOT_BASE}/sqlbot/.env ]]; then
        source $SQLBOT_BASE/sqlbot/.env
        INSTALL_TYPE='upgrade'
        log_content "升级安装"
    else
        INSTALL_TYPE='install'
        mkdir -p ${SQLBOT_BASE}
        log_content "全新安装"
    fi
    set +a
}

function set_run_base_path() {
    log_title "设置运行目录"
    SQLBOT_RUN_BASE=$SQLBOT_BASE/sqlbot
    CONF_FOLDER=${SQLBOT_RUN_BASE}/conf
    TEMPLATES_FOLDER=${SQLBOT_RUN_BASE}/templates
    log_content "运行目录 $SQLBOT_RUN_BASE"
    log_content "配置文件目录 $CONF_FOLDER"
}

function prepare_sqlbot_run_base() {
    log_title "初始化运行目录"
    cd ${CURRENT_DIR}
    mkdir -p ${SQLBOT_RUN_BASE}
    log_content "复制安装文件到运行目录"
    cp -r ./sqlbot/* ${SQLBOT_RUN_BASE}/

    cd ${SQLBOT_RUN_BASE}
    env | grep SQLBOT_ >.env

    mkdir -p ${SQLBOT_RUN_BASE}/conf
    mkdir -p ${SQLBOT_RUN_BASE}/data/sqlbot/{excel,images,logs}

    if [ "${SQLBOT_EXTERNAL_DB}" = "false" ]; then
        mkdir -p ${SQLBOT_RUN_BASE}/data/postgresql
        export SQLBOT_DB_PORT=5432
    else
        sed -i -e "/^    depends_on/,+2d" docker-compose.yml
    fi

    log_content "调整配置文件参数"
    cd ${SQLBOT_RUN_BASE}
    cp -r ${TEMPLATES_FOLDER}/* ${CONF_FOLDER}

    cd ${TEMPLATES_FOLDER}
    templates_files=( sqlbot.conf )
    for i in ${templates_files[@]}; do
       if [ -f $i ]; then
           envsubst < $i > ${CONF_FOLDER}/$i
       fi
    done
}

function update_sctl() {
    log_title "安装 sctl 命令行工具"
    log_content "安装至 /usr/local/bin/sctl & /usr/bin/sctl"
    cd ${CURRENT_DIR}
    sed -i -e "s#SQLBOT_BASE=.*#SQLBOT_BASE=${SQLBOT_BASE}#g" sctl
    \cp sctl /usr/local/bin && chmod +x /usr/local/bin/sctl
    if [ ! -f /usr/bin/sctl ]; then
        ln -s /usr/local/bin/sctl /usr/bin/sctl 2>/dev/null
    fi
}

function prepare_system_settings() {
    log_title "修改操作系统相关设置"
    if which getenforce >/dev/null 2>&1 && [ $(getenforce) == "Enforcing" ];then
        log_content  "关闭 SELINUX"
        setenforce 0
        sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    fi

    if which firewall-cmd >/dev/null 2>&1; then
        if systemctl is-active firewalld &>/dev/null ;then
            log_content "开启防火墙端口 ${SQLBOT_WEB_PORT}"
            firewall-cmd --zone=public --add-port=${SQLBOT_WEB_PORT}/tcp --permanent
            log_content "开启防火墙端口 ${SQLBOT_MCP_PORT}"
            firewall-cmd --zone=public --add-port=${SQLBOT_MCP_PORT}/tcp --permanent
            firewall-cmd --reload
        else
            log_content "防火墙未开启，忽略端口开放"
        fi
    fi
}

function install_docker() {
    log_title "安装 docker"
    #Install docker
    ##Install Latest Stable Docker Release
    cd ${CURRENT_DIR}

    if which docker >/dev/null 2>&1; then
        log_content "检测到 Docker 已安装，跳过安装步骤"
        log_content "启动 Docker "
        service docker start >/dev/null 2>&1 | tee -a ${CURRENT_DIR}/install.log
    else
       if [[ -d docker ]]; then
           log_content "离线安装 docker"
           cp docker/bin/* /usr/bin/
           cp docker/service/docker.service /etc/systemd/system/
           chmod +x /usr/bin/docker*
           chmod 644 /etc/systemd/system/docker.service
       else
           log_content "在线安装 docker"
           curl -fsSL https://resource.fit2cloud.com/get-docker-linux.sh -o get-docker.sh 2>&1 | tee -a ${CURRENT_DIR}/install.log
           if [[ ! -f get-docker.sh ]];then
              log_content "docker 在线安装脚本下载失败，请稍候重试"
              exit 1
           fi
           sudo sh get-docker.sh 2>&1 | tee -a ${CURRENT_DIR}/install.log
       fi

       docker_config_folder="/etc/docker"
       if [ ! -d "$docker_config_folder" ];then
           mkdir -p "$docker_config_folder"
           cat <<EOF> $docker_config_folder/daemon.json
           {
              "log-driver": "json-file",
              "log-opts": {
                  "max-file": "3",
                  "max-size": "10m"
              }
           }
EOF
       fi

       log_content "启动 docker"
       systemctl enable docker >/dev/null 2>&1; systemctl daemon-reload; systemctl start docker 2>&1 | tee -a ${CURRENT_DIR}/install.log

       docker version >/dev/null 2>&1
       if [ $? -ne 0 ]; then
           log_content "docker 安装失败"
           exit 1
       else
           log_content "docker 安装成功"

       fi
    fi
}

function install_docker_compose() {
    log_title "安装 docker-compose"
    #Install docker-compose
    cd ${CURRENT_DIR}
    ##Install Latest Stable Docker Compose Release
    docker-compose version >/dev/null 2>&1
    if [ $? -ne 0 ]; then
       docker compose version >/dev/null 2>&1
       if [ $? -eq 0 ]; then
           echo 'docker compose "$@"' > /usr/bin/docker-compose
           chmod +x /usr/bin/docker-compose
       else
           if [[ -d docker ]]; then
              log_content "离线安装 docker-compose"
              cp docker/bin/docker-compose /usr/bin/
              chmod +x /usr/bin/docker-compose
           else
              log_content "在线安装 docker-compose"
              curl -L https://resource.fit2cloud.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s | tr A-Z a-z)-$(uname -m) -o /usr/local/bin/docker-compose 2>&1 | tee -a ${CURRENT_DIR}/install.log
              if [[ ! -f /usr/local/bin/docker-compose ]];then
                  log_content "docker-compose 下载失败，请稍候重试"
                  exit 1
              fi
              chmod +x /usr/local/bin/docker-compose
              ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
           fi
       fi

       docker-compose version >/dev/null
       if [ $? -ne 0 ]; then
           log_content "docker-compose 安装失败"
           exit 1
       else
           log_content "docker-compose 安装成功"
       fi
    else
       log_content "检测到 Docker Compose 已安装，跳过安装步骤"
    fi
    export COMPOSE_HTTP_TIMEOUT=180
}

function load_images() {
    log_title "加载 SQLBOT 镜像"
    cd ${CURRENT_DIR}

    for i in $(docker images --format '{{.Repository}}:{{.Tag}}' | grep dataease); do
       current_images[${#current_images[@]}]=${i##*/}
    done

    # 加载镜像
    if [[ -d images ]]; then
       for i in $(ls images); do
           if [[ "${current_images[@]}"  =~ "${i%.tar.gz}" ]]; then
              log_content "已存在镜像 ${i%.tar.gz}"
           else
              log_content "加载镜像 ${i%.tar.gz}"
              docker load -i images/$i >/dev/null 2>&1 | tee -a ${CURRENT_DIR}/install.log
           fi
       done
    else
       SQLBOTVERSION=$(cat ${CURRENT_DIR}/sqlbot/templates/version)
       curl -sfL https://resource.fit2cloud.com/installation-log.sh | sh -s sqlbot ${INSTALL_TYPE} ${SQLBOTVERSION}
    fi
}

function start_sqlbot() {
    log_title "启动 SQLBOT 服务"
    sctl reload 2>&1 | tee -a ${CURRENT_DIR}/install.log
    if [[ $? -ne 0 ]]; then
        log_content "SQLBOT 服务启动失败，请检查日志"
        exit 1
    fi
    echo
    if [[ $INSTALL_TYPE != "upgrade" ]];then
       echo -e "======================= 安装完成 =======================\n" 2>&1 | tee -a ${CURRENT_DIR}/install.log
       echo -e "系统登录信息如下:\n\t访问地址: http://服务器IP:$SQLBOT_WEB_PORT\n\t用户名: admin\n\t初始密码: SQLBot@123456" 2>&1 | tee -a ${CURRENT_DIR}/install.log
    else
       echo -e "======================= 升级完成 =======================\n" 2>&1 | tee -a ${CURRENT_DIR}/install.log
    fi
}

function main() {
    check_and_prepare_env_params
    set_run_base_path
    prepare_sqlbot_run_base
    update_sctl
    prepare_system_settings
    install_docker
    install_docker_compose
    load_images
    start_sqlbot
}

main
