#!/bin/bash
# coding=utf-8

############################### 定义变量和函数 ###############################
# 版本
version=1
# 镜像仓库
registry=1
# 获取日期
date=$(date -d "-1 day" +"%Y%m%d")

# 检测 docker compose 可用性
if docker compose version &>/dev/null; then
    DOCKER_COMPOSE="docker compose"
else
    DOCKER_COMPOSE="docker-compose"
fi

# 显示版本列表
function show_versions() {
    echo ""
    echo "Please select the version you want to install: (请选择你想要安装的版本)"
    echo "1. FastBee open source version (开源版本)"
    echo "2. FastBee commercial version(商业版本)"
    echo "3. FastBee commercial version include emqx and tdengine(商业版本+emqx+tdengine)"
    echo "4. exit(退出)"
}

# 显示镜像仓库
function show_registry() {
    echo ""
    echo "Please select docker image repository： (请选择docker镜像仓库)"
    echo "1. Docker official image repository (Docker官方镜像仓库-推荐)"
    echo "2. FastBee private image repository (FastBee私有镜像仓库)"
    echo "3. exit(退出)"
}

# 配置docker镜像源
function config_registry(){
    sudo systemctl stop docker
    # 如果文件不存在，则新建
    sudo mkdir -p /etc/docker
    # 修改 Docker 的配置文件
    sudo tee /etc/docker/daemon.json <<-EOF
    {
        "registry-mirrors": [
            "https://mirrors.ustc.edu.cn",
            "https://docker.chenby.cn",
            "http://mirror.azure.cn",
            "https://dockerpull.org",
            "https://dockerhub.icu",
            "https://hub.rat.dev",
            "https://dockerproxy.com",
            "https://mirror.baidubce.com",
            "https://docker.m.daocloud.io",
            "https://docker.nju.edu.cn",
            "https://docker.mirrors.sjtug.sjtu.edu.cn",
            "https://docker.rainbond.cc",
            "https://mirror.ccs.tencentyun.com",
            "https://registry.docker-cn.com",
            "https://hub-mirror.c.163.com",
            "https://docker.1ms.run", 
            "https://doublezonline.cloud", 
            "https://dislabaiot.xyz", 
            "https://docker.fxxk.dedyn.io", 
            "https://docker.unsee.tech", 
            "https://docker.1panel.live", 
            "https://docker.nastool.de", 
            "https://docker.zhai.cm", 
            "https://docker.5z5f.com", 
            "https://a.ussh.net", 
            "https://docker.udayun.com", 
            "https://hub.geekery.cn",
            "https://noohub.ru", 
            "https://huecker.io",
            "https://dockerhub.timeweb.cloud",
            "https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
            "https://5tqw56kt.mirror.aliyuncs.com",
            "https://docker.ckyl.me/",
            "https://docker.hpcloud.cloud"
        ]
    }
EOF
    # 重新启动 Docker 服务
    sudo systemctl daemon-reload
    sudo systemctl start docker
    if [ $? -ne 0 ]; then
        echo "WARNING: If installing Docker on Windows, please manually config docker registry-mirrors and restart."
        echo "警告：使用windows安装docker请手动配置docker镜像源并重启"
    fi
}

# 选择docker镜像仓库
function select_registry(){
    while true
    do
        # 显示镜像仓库列表
        show_registry
        # 读取用户输入
        read -p "Please enter your registry selection (请输入你选择的仓库) ：" registry
        echo ""
        # 根据用户选择进行操作
        case $registry in
            1)
                echo "INFO: Using official docker image repository"
                config_registry
                break
                ;;
            2)
                echo "INFO: Using FastBee private docker image repository"
                break
                ;;
            3)
                echo "INFO: Exit the program"
                exit 0
                ;;
            *)
                echo "INFO: Invalid selection, please re-enter!"
                ;;
        esac
    done
}


# 下载开源版本配置文件
function download_open_source(){
    # 下载配置和打包文件
    echo "INFO: Downloading files takes some time, please be patient and wait...（下载文件需要一定时间，请耐心等待）"
    # 下载配置
    if [ ! -f /var/data.tar ]; then
        wget -P /var -c https://hub.fastbee.cn/resource/open-source/data.tar 
        if [ $? -ne 0 ]; then
            echo "ERROR: download data file failed!"
            exit 1
        fi
    fi
    # 解压
    sudo tar -xvf /var/data.tar -C /var
}

# 验证
function vertify(){
    echo ""
    # 读取用户输入
    read -p "INFO: Please enter fastbee commercial version password: (请输入FastBee商业版本安装密码：) ：" pwd
    if [[ $pwd != "fastbee"$date ]]; then
        echo "ERROR: Incorrect password, please contact customer service for assistance.（密码错误，请联系客服获取）"
        exit 2
    fi
}

# 检查unzip/zip是否安装
function check_zip_utils() {
    if ! command -v unzip &> /dev/null; then
        echo "INFO: unzip not found, installing..."
        if command -v apt &> /dev/null; then
            sudo apt install unzip -y
        elif command -v yum &> /dev/null; then
            sudo yum install unzip -y
        else
            echo "ERROR: Please install unzip manually first"
            exit 12
        fi
    fi
    if ! command -v zip &> /dev/null; then
        echo "INFO: zip not found, installing..."
        if command -v apt &> /dev/null; then
            sudo apt install zip -y
        elif command -v yum &> /dev/null; then
            sudo yum install zip -y
        else
            echo "ERROR: Please install zip manually first"
            exit 13
        fi
    fi
}

# 下载商业版本配置文件
function download_commerial(){
    # 验证
    vertify
    # 检查解压工具
    check_zip_utils
    # 下载配置和打包文件
    echo "INFO: Downloading files takes some time, please be patient and wait...（下载文件需要一定时间，请耐心等待）"
    # 下载配置
    if [ ! -f /var/data.tar ]; then
        wget -P /var -c https://hub.fastbee.cn/resource/commercial/data.tar
        if [ $? -ne 0 ]; then
            echo "ERROR: download data file failed!"
            exit 3
        fi
    fi
    # 解压
    sudo tar -xvf /var/data.tar -C /var
	
	# 添加证书名配置步骤
    echo ""
    read -p "INFO: Please enter your license subject name: (请输入您的证书名) ：" license_subject
    if [ -z "$license_subject" ]; then
        echo "ERROR: License subject name cannot be empty! (证书名不能为空)"
        exit 8
    fi
    
    # 进入java目录
    if [ ! -d "/var/data/java" ]; then
        echo "ERROR: /var/data/java directory not found! (未找到java目录)"
        exit 9
    fi
    
    cd /var/data/java
	sudo chmod 777 .
    
    # 检查jar文件
    if [ ! -f "fastbee-admin.jar" ]; then
        echo "ERROR: fastbee-admin.jar file not found! (未找到fastbee-admin.jar文件)"
        exit 10
    fi
    
    # 创建临时目录用于解压jar文件
    mkdir -p temp_jar
    cd temp_jar
    
    # 用unzip解压（替代jar命令）
    unzip ../fastbee-admin.jar -d .
    
    # 修改application-prod.yml文件中的license.subject值
    if [ ! -f "BOOT-INF/classes/application-prod.yml" ]; then
        echo "ERROR: application-prod.yml file not found in jar! (在jar包中未找到application-prod.yml文件)"
        exit 11
    fi
    
    # 使用sed命令替换license.subject的值
    sed -i "s/subject: common/subject: $license_subject/g" BOOT-INF/classes/application-prod.yml
    
    # 用zip重新打包（替代jar命令）
    zip -r -0 ../fastbee-admin.jar ./*
    
    # 清理临时目录
    cd ..
    rm -rf temp_jar
    
    echo "INFO: License subject name has been updated to: $license_subject (证书名已更新为: $license_subject)"
}

# 下载商业版本配置文件（含emqx和tdengine）
function download_commerial_emqx(){
    # 验证
    vertify
    # 检查解压工具
    check_zip_utils
    # 下载配置和打包文件
    echo "INFO: Downloading files takes some time, please be patient and wait...（下载文件需要一定时间，请耐心等待）"
    # 下载配置
    if [ ! -f /var/data.tar ]; then
        wget -P /var -c https://hub.fastbee.cn/resource/commercial-emqx/data.tar
        if [ $? -ne 0 ]; then
            echo "ERROR: download data file failed!"
            exit 4
        fi
    fi
    # 解压
    sudo tar -xvf /var/data.tar -C /var
	
	# 添加证书名配置步骤
    echo ""
    read -p "INFO: Please enter your license subject name: (请输入您的证书名) ：" license_subject
    if [ -z "$license_subject" ]; then
        echo "ERROR: License subject name cannot be empty! (证书名不能为空)"
        exit 8
    fi
    
    # 进入java目录
    if [ ! -d "/var/data/java" ]; then
        echo "ERROR: /var/data/java directory not found! (未找到java目录)"
        exit 9
    fi
    
    cd /var/data/java
	sudo chmod 777 .
    
    # 检查jar文件
    if [ ! -f "fastbee-admin.jar" ]; then
        echo "ERROR: fastbee-admin.jar file not found! (未找到fastbee-admin.jar文件)"
        exit 10
    fi
    
    # 创建临时目录用于解压jar文件
    mkdir -p temp_jar
    cd temp_jar
    
    # 用unzip解压（替代jar命令）
    unzip ../fastbee-admin.jar -d .
    
    # 修改application-prod.yml文件中的license.subject值
    if [ ! -f "BOOT-INF/classes/application-prod.yml" ]; then
        echo "ERROR: application-prod.yml file not found in jar! (在jar包中未找到application-prod.yml文件)"
        exit 11
    fi
    
    # 使用sed命令替换license.subject的值
    sed -i "s/subject: common/subject: $license_subject/g" BOOT-INF/classes/application-prod.yml
    
    # 用zip重新打包（替代jar命令）
    zip -r -0 ../fastbee-admin.jar ./*
    
    # 清理临时目录
    cd ..
    rm -rf temp_jar
    
    echo "INFO: License subject name has been updated to: $license_subject (证书名已更新为: $license_subject)"
}

# 安装
function install(){
   cd /var/data
   # docker-compose拉取镜像
   echo "INFO: Pulling the image takes some time, please be patient and wait.（拉取镜像需要一定时间，请耐心等待）"
    if [ $registry -eq 2 ]; then
        # 登入私有仓库
        docker logout
        docker login --username=fastbee --password=fastbee hub.fastbee.cn
        # 私有镜像仓库
        $DOCKER_COMPOSE -f /var/data/docker-compose-fastbee.yml pull
        if [ $? -ne 0 ]; then
            echo "ERROR: docker compose pull images failed!"
            exit 5
        fi
    else
        # 官方镜像仓库
        $DOCKER_COMPOSE pull
        if [ $? -ne 0 ]; then
            echo "ERROR: docker compose pull images from fastbee hub failed!"
            exit 6
        fi
    fi
    
    # 开始部署
    echo "INFO: Begin docker compose deploying ..."
    if [ $registry -eq 2 ]; then
        # 私有镜像仓库
        $DOCKER_COMPOSE -f /var/data/docker-compose-fastbee.yml up -d
    else
        # 官方镜像仓库
        $DOCKER_COMPOSE up -d
        $DOCKER_COMPOSE logs
    fi

    # 查看日志
    $DOCKER_COMPOSE logs
    # 解决mysql初始化耗时导致后端启动失败问题
    sleep 15 && docker restart java
    echo -e "\nPulled docker images:"
    $DOCKER_COMPOSE images
    echo -e "Runnin docker containers:"
    $DOCKER_COMPOSE ps
    # 打印成功信息
    echo ""
    echo "------------------------------------------------------"
    echo "| Fastbee installation and deployment successful !!! |"
    echo "------------------------------------------------------"
}

############################### 执行部署 ###################################
echo "INFO: FastBee Open Source IOT Platform Deploying ..."

# 1.检查docker环境
echo "INFO: Check docker environment ..."
docker -v
docker compose version &>/dev/null || docker-compose -v
if [ $? -ne 0 ]; then
    echo "ERROR: Please install docker and docker-compose first and then re-execute script!"
    exit 7
else
    echo "INFO: docker and docker-compose is installed."
fi

# 文件夹添加权限
sudo chmod 777 /var

# 2. 开始安装部署
while true; do
    # 显示版本列表
    show_versions
    # 读取用户输入
    read -p "Please enter your version selection(请输入你选择的版本) ：" choice
    echo ""
    # 根据用户选择进行操作
    case $choice in
        1)
            select_registry
            echo "INFO: FastBee open source version deploying ..."
            # 下载开源版本配置
            download_open_source
            # 安装
            install
            exit 0
            ;;
        2)
            select_registry
            echo "INFO: FastBee commercial version deploying ..."
            # 下载商业版本配置
            download_commerial
            # 安装
            install
            exit 0
            ;;
        3)
            select_registry
            echo "INFO: FastBee commercial version include emqx and tdengine deploying ..."
            # 下载商业版本（emqx+tdengine）配置
            download_commerial_emqx
            # 安装
            install
            exit 0
            ;;
        4)
            echo "INFO: Exit the program"
            exit 0 
            ;;
        *)
            echo "INFO: Invalid selection, please re-enter!"
            ;;
    esac
done
