#!/usr/bin/env	bash
# author: Edison Y
# PATH设置

export PATH=/sbin:/bin:/usr/sbin:/usr/bin

export packagepath=$PWD

export webpath=/usr/local

#存放外部依赖包
export pkgpath=$PWD/pkg

export logpath=/tmp

# 如果dbpath未在其他地方定义，需要在此定义
export dbpath=${DB_PATH:-/usr/local}

# 定义颜色变量
red='\033[0;31m'
yellow='\033[1;33m'
blue='\033[0;34m'
green='\033[0;32m'
pink='\E[1;35m'
NC='\033[0m' # No Color

# 彩色文字输出函数
echoColor()
{
    # 循环读取参数
    for ((i=1; i<=$#; i+=2)); do
        color=${!i}
        content=$(($i + 1))
        echo -e -n "${!color}${!content}${NC} "
    done
    echo;
}

# 统一日志记录函数
logMessage() {
    local level=$1
    local message=$2
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" >> $logpath/install.log
}

printDHR() 
{
	echoColor pink "Start" blue "deploying" red "DHR"	yellow "services" pink ">>>>>>"
	sleep 1
	echoColor red "   ___   " yellow "  _  _  " green "  ___  "
	echoColor red "  |   \  " yellow " | || | " green " | _ \ "
	echoColor red "  | |) | " yellow " | __ | " green " |   / "
	echoColor red "  |___/  " yellow " |_||_| " green " |_|_\ "
	sleep 1
	echoColor pink "Shell" green "script"  red "disigned" yellow "by" blue "EdisonY"
}

printDHR

# 检查脚本执行权限
if [ "$(id -u)" -ne 0 ]; then
    echoColor red "请使用root用户或sudo执行此脚本"
    exit 1
fi

# 检查CPU架构
checkCPUArch() {
    local cpu_arch
    cpu_arch=$(uname -m)
    
    echoColor blue "检测到CPU架构: $cpu_arch"
    logMessage "INFO" "CPU架构: $cpu_arch"
    
    case "$cpu_arch" in
        x86_64|i386|i686)
            echoColor green "x86架构"
            logMessage "INFO" "x86架构"
            # 设置x86架构的JDK包名
            export JDK_PACKAGE="ehr_jdk.tar.gz"
            ;;
        aarch64|arm64)
            echoColor green "ARM64架构"
            logMessage "INFO" "ARM64架构"
            # 设置ARM架构的JDK包名
            export JDK_PACKAGE="ehr_jdk_aarch.tar.gz"
            ;;
        *)
            echoColor red "不支持的CPU架构: $cpu_arch"
            logMessage "ERROR" "不支持的CPU架构: $cpu_arch"
            exit 1
            ;;
    esac
}

# 执行CPU架构检查
checkCPUArch

# 检查必要文件是否存在
checkRequiredFiles() {
    local missing=0
    
    # 检查对应架构的JDK包
    if [ ! -f "$packagepath/$JDK_PACKAGE" ]; then
        echoColor red "缺少文件: $JDK_PACKAGE"
        missing=1
    fi
    
    if [ ! -f "$packagepath/ehr_privatization.war" ]; then
        echoColor red "缺少文件: ehr_privatization.war"
        missing=1
    fi
    
    if [ ! -f "$packagepath/deployDHR.sh" ]; then
        echoColor red "缺少文件: deployDHR.sh"
        missing=1
    fi
    
    if [ $missing -eq 1 ]; then
        echoColor red "请确保所有必要文件都在 $packagepath 目录下"
        exit 1
    fi
    
    logMessage "INFO" "必要文件检查通过"
}

# 执行必要文件检查
checkRequiredFiles

# 配置文件描述符限制
configureFileDescriptor() {
    echoColor blue "开始配置文件描述符限制......"
    logMessage "INFO" "Configuring file descriptor limits"
    
    # 临时生效：设置当前会话的文件描述符限制
    ulimit -n 65535
    ulimit -u 65535
    echoColor green "临时文件描述符限制已设置 (nofile: 65535, nproc: 65535)"
    logMessage "INFO" "Temporary file descriptor limits set: nofile=65535, nproc=65535"
    
    # 永久生效：修改 /etc/security/limits.conf
    if ! grep -q "root soft nofile 65535" /etc/security/limits.conf 2>/dev/null; then
        echo "root soft nofile 65535" >> /etc/security/limits.conf
        echo "root hard nofile 65535" >> /etc/security/limits.conf
        echo "root soft nproc 65535" >> /etc/security/limits.conf
        echo "root hard nproc 65535" >> /etc/security/limits.conf
        echoColor green "永久文件描述符限制已写入 /etc/security/limits.conf"
        logMessage "INFO" "Permanent file descriptor limits written to /etc/security/limits.conf"
    else
        echoColor yellow "文件描述符限制已存在，跳过配置"
        logMessage "INFO" "File descriptor limits already configured"
    fi
    
    # 验证配置
    local current_nofile=$(ulimit -n)
    local current_nproc=$(ulimit -u)
    echoColor green "当前文件描述符限制: nofile=$current_nofile, nproc=$current_nproc"
    logMessage "INFO" "Current limits: nofile=$current_nofile, nproc=$current_nproc"
    
    sleep 1
}

# 配置文件描述符限制
configureFileDescriptor

#三个服务进程状态判断函数
pidCheck() {
	Tomcat="dhr.war"
	PGSQL="postgres"
	MongoDB="mongod"
	#这里判断传入的参数是否不等于1个
	if [ $# -ne 1 ];then
		echo "Usage $0 content {tomcat|postgres|mongod}"
		exit
	fi

	case "$1" in
	tomcat|TOMCAT)
			# 使用pgrep精确匹配，避免grep自身干扰
			count=$(pgrep -f "java.*dhr.war" 2>/dev/null | wc -l)
			if [[ $count == 0 ]];then
				echoColor green "$Tomcat process not exist"
				return 1
			else
				echoColor red "$Tomcat process exist (count: $count)"
				return 0
			fi
			;;
	postgres|POSTGRES)
			count=$(pgrep -f "postgres" 2>/dev/null | wc -l)
			if [[ $count == 0 ]];then
				echoColor green "$PGSQL process not exist"
				return 1
			else
				echoColor red "$PGSQL process exist"
				return 0
			fi
			;;
	mongod|MONGOD)
			count=$(pgrep -f "mongod" 2>/dev/null | wc -l)
			if [[ $count == 0 ]];then
				echoColor green "$MongoDB process not exist"
				return 1
			else
				echoColor red "$MongoDB process exist"
				return 0
			fi
			;;
			*)
			echo -e "请输入指定的服务名称：{tomcat|postgres|mongod}"
	esac
}

#服务是否安装判断
isInstall() {
	Tomcat="tomcat"

	PGSQL="postgres"

	MongoDB="mongod"

	if [ $# -ne 1 ];then
		echo "Usage $0 content {tomcat|postgres|mongod}"
		exit
	fi
	case "$1" in	
		mongod|MONGOD)
			if [ -f "$dbpath/ehr/mongodb8/bin/mongod" ]  || [ -f "$dbpath/ehr/mongodb6/bin/mongod" ]
			then
				echoColor red "mongodb已安装"
				return 0
			else
				echoColor green "mongodb未安装"
				return 1
			fi
			;;
		postgres|POSTGRES)	
			if	[ -f "$dbpath/ehr/postgresql15/bin/psql" ]
			then
				echoColor red "postgresql已安装"
				return 0
			else
				echoColor green "postgresql未安装"
				return 1
			fi
			;;
		tomcat|TOMCAT)
			if	[ -f "$webpath/dhr/dhr.war" ]
			then
				echoColor red "tomcat已安装"
				return 0
			else
				echoColor green "tomcat未安装"
				return 1
			fi
			;;
		*)
        	echo "请输入指定的服务名称：{tomcat|postgres|mongod}"
			return 1
			;;
	esac
}

#java基础环境部署
deployJavaEnvironment() {
    if [ -f "$packagepath/$JDK_PACKAGE" ]
    then
        echoColor blue "正在解压JDK包: $JDK_PACKAGE"
        tar xf $packagepath/$JDK_PACKAGE -C $webpath
        if [ $? -eq 0 ]; then
            echoColor green "Java环境已安装 (架构: $(uname -m))"
            logMessage "INFO" "Java环境安装成功: $JDK_PACKAGE"
        else
            echoColor red "Java环境解压失败"
            logMessage "ERROR" "Java环境解压失败"
            return 1
        fi
    else
        echoColor red "Java环境安装包不存在: $JDK_PACKAGE"
        logMessage "ERROR" "Java环境安装包不存在: $JDK_PACKAGE"
        return 1
    fi
}

#dhr服务部署
deployDHR() {
	if [ -f $packagepath/ehr_privatization.war ]
	then
		# 先复制war文件
		cp -f $packagepath/ehr_privatization.war $webpath
		if [ $? -ne 0 ]; then
			echoColor red "拷贝war文件失败"
			logMessage "ERROR" "拷贝war文件失败"
			exit 1
		fi
		
		# 复制deployDHR.sh（如果存在）
		if [ -f $packagepath/deployDHR.sh ]; then
			cp -f $packagepath/deployDHR.sh $webpath
		fi
		
		# 复制properties文件（如果存在）
		for prop_file in $packagepath/*.properties; do
			if [ -f "$prop_file" ]; then
				cp -f "$prop_file" $webpath
			fi
		done
		
		# 执行部署脚本
		if [ -f $webpath/deployDHR.sh ]; then
			sh $webpath/deployDHR.sh >> $logpath/install.log 2>&1
			if [ $? -ne 0 ]; then
				echoColor red "deployDHR.sh执行失败，请查看日志: $logpath/install.log"
				logMessage "ERROR" "deployDHR.sh执行失败"
				exit 1
			fi
		else
			echoColor yellow "deployDHR.sh不存在，跳过执行"
			logMessage "WARNING" "deployDHR.sh not found"
		fi
		
		logMessage "INFO" "DHR服务部署成功"
	else
		echoColor red "请确认安装包内是否存在ehr_privatization.war文件"
        logMessage "ERROR" "缺少ehr_privatization.war文件"
        exit 1
	fi
}

#测试从应用服务器是否能正常访问到license系统
testConnection() {
	curl --head --silent --fail https://license.x-dhr.com 2>&1 >/dev/null
	if [ $? -eq 0 ]; then
		echoColor green "正常访问https://license.x-dhr.com/"
		#echoColor green "start deployweb ......"
		#启动薪事力服务
		if [ -d "$webpath/dhr" ]; then
			cd $webpath/dhr
			sh startDHR.sh
		else
			echoColor red "DHR目录不存在: $webpath/dhr"
			logMessage "ERROR" "DHR目录不存在"
			exit 1
		fi
	else
		echoColor red "请确认是否安装curl命令，如果已经安装，请开放访问https://license.x-dhr.com/和https://www.x-dhr.com/地址，用做license在线校验,开放后启动应用服务"
		logMessage "ERROR" "访问license系统失败"
		exit 1
	fi
}

#选择是否配置软加密，启动薪事力服务
chooseEncryptionFile() {
	echoColor yellow "请确认本次部署是否为普通环境部署（输入y代表非软加密方式进行部署，输入n代表采用软加密方式进行部署）（y/n）"
	read user_select
	case "$user_select" in
		Y|y)
			echo "测试访问license系统"
			testConnection
			;;
		N|n)
			echo "配置软加密文件"
			if [ -f "$packagepath/key" ]; then
				# 确保目标目录存在
				mkdir -p $webpath/dhr/config
				\cp $packagepath/key $webpath/dhr/config
				logMessage "INFO" "软加密文件配置成功"
			else
				echoColor red "加密key文件不存在: $packagepath/key"
				logMessage "ERROR" "加密key文件不存在"
				exit 1
			fi

			sleep 1

			#启动薪事力服务
			if [ -d "$webpath/dhr" ]; then
				cd $webpath/dhr
				sh startDHR.sh
			else
				echoColor red "DHR目录不存在: $webpath/dhr"
				logMessage "ERROR" "DHR目录不存在"
				exit 1
			fi
			;;
		*)
			echo "请输入正确的选项(y/n)"
			chooseEncryptionFile
			;;
	esac
}

############################################################################

#create db install path and update dependent shell script

if isInstall tomcat;then
		echoColor red "Tomcat已存在，跳过Java环境安装"
	else
		deployJavaEnvironment
	fi

# 无论Tomcat是否已安装，都执行DHR部署（支持重新部署/升级）
deployDHR

#choosen set key file or not, and test whether the website can be accessed normally and start webservice
chooseEncryptionFile

# 动态等待服务启动
echoColor yellow "等待服务启动..."
sleep 180

max_wait=180
wait_count=0
while [ $wait_count -lt $max_wait ]; do
    # 使用pgrep精确检查java进程是否包含dhr.war
    tomcat_count=$(pgrep -f "java.*dhr.war" 2>/dev/null | wc -l)
    if [ "$tomcat_count" -gt 0 ]; then
        echo
        echoColor green "服务已启动 (等待时间: ${wait_count}秒, 进程数: $tomcat_count)"
        break
    fi
    sleep 5
    wait_count=$((wait_count + 5))
    echo -n "."
done
echo

if [ $wait_count -ge $max_wait ]; then
    echoColor red "服务启动超时 (等待: ${max_wait}秒)"
    logMessage "ERROR" "服务启动超时"
fi

#check dhr service status and init postgresql
# 使用pgrep进行最终检查
tomcat_count=$(pgrep -f "java.*dhr.war" 2>/dev/null | wc -l)
if [ "$tomcat_count" -gt 0 ];then
	echoColor green "dhr服务启动成功 (进程数: $tomcat_count)"
	logMessage "INFO" "dhr服务启动成功"
	#echoColor red "请完整复制如下命令在数据库服务器上进行执行!"
	echoColor yellow "请切换到数据库服务器下载sql文件并执行预置postgre数据库语句！！！"
else 
	echoColor red "dhr服务启动失败，请检查$webpath/dhr/logs/dhr.log日志内容排查错误"
	logMessage "ERROR" "dhr服务启动失败"
	echoColor red "请在dhr服务启动正常访问后，切换到数据库服务器执行预置postgre数据库语句！！！"
	#`ps aux | grep 'postgresql15/bin' | grep -v grep | sed -n 's|.* \(/[^ ]*/postgresql15/bin\)/.*|\1|p'`/psql -f ./init_PostgreSQL_Index.sql -U postgres -p 5632 -h 127.0.0.1 -d dbehr

fi

