#!/usr/bin/env bash

# program : mysql_docker_server.sh
#  author : wangqijia@youzan.com
#    date : 2020-05-20
# version : 0.0.0.1


# exit shell with err_code
# $1 : err_code
# $2 : err_msg

exit_on_err()
{
    [[ ! -z "${2}" ]] && echo "${2}" 1>&2
    exit ${1}
}

# display usage
function usage() {
echo "
usage: ${0} [n]

    -h : help
         Prints the ${0} help
    -n : database name
         specify app name, eg: -n app1
    -s : shutdown local mysql instance
"
}

function version_ge() {
    test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"
}

function docker_install(){
    MIN_DOCKER_VERSION="17.03"

    echo "检查Docker......"
    DOCKER_VERSION_STR=`docker -v`

    if [ $? -eq 0 ]; then
        echo "检查到Docker本地已安装！"
        DOCKER_VERSION=`echo $DOCKER_VERSION_STR | grep -Eo '([0-9]+\.){1,2}[0-9]+'`
        if version_ge $DOCKER_VERSION $MIN_DOCKER_VERSION; then
            echo "当前Docker版本$DOCKER_VERSION, 检查Docker版本OK！"
        else
            exit_on_err 1 "当前Docker版本$DOCKER_VERSION, 请安装Docker CE 17.03及以上版本！"
        fi
    else
        exit_on_err 1 "请先安装Docker，Docker CE 17.03及以上版本！"
    fi
}

SHUTDOWN_FLAG=0

# the main function
function main() {
    DB_NAME=""

    while getopts "hsn:" ARG
    do
        case ${ARG} in
            h)
                usage
                exit
            ;;
	    s)
		SHUTDOWN_FLAG=1
	    ;;
            n)
                DB_NAME=$OPTARG
                echo "您指定要创建的应用数据库是：${DB_NAME}"
            ;;
        esac
    done

    docker_install

    if [ $SHUTDOWN_FLAG -eq 1 ]; then
	docker ps | grep "yz-mysql"
    	if [ $? -eq 0 ]; then
            docker stop yz-mysql
            echo "mysql组件容器服务已停止！"
	else
	    echo "mysql组件尚未启动！"
        fi
	exit 0
    fi

    #安装mysql组件容器
    echo "准备启动本地mysql容器服务实例！"
    #检查mysql镜像是否已存在
    docker images | grep "hub-mirror.c.163.com/library/mysql" | grep "5.6"
    if [ $? -ne 0 ]; then
        exit_on_err 1 "本地mysql镜像不存在，请先下载mysql镜像。"
    fi

    #检查mysql容器服务是否已启动
    docker ps | grep "yz-mysql"
    if [ $? -eq 0 ]; then
        echo "mysql组件容器服务已启动！"
    else
        #检查mysql容器是否已创建
        docker ps -a | grep "yz-mysql"
        if [ $? -eq 0 ]; then
            echo "mysql组件容器服务已创建，尚未启动！"
	        docker start yz-mysql
            if [ $? -eq 0 ]; then
                echo "mysql组件容器服务重新启动成功！"
            else
                exit_on_err 1 "mysql组件容器启动失败！"
            fi
        else
            #创建并启动mysql组件容器
            echo "准备创建并启动mysql组件容器服务..."
            docker run -d --name yz-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 hub-mirror.c.163.com/library/mysql:5.6
            if [ $? -eq 0 ]; then
                echo "创建并启动mysql组件容器成功！！！"
            else
                exit_on_err 1 "mysql组件容器创建并启动失败！"
            fi

        fi
    fi

    echo "检查mysql容器是否成功..."
    sleep 10
        
	count=0
    max_count=6
    while [ 1 ]
    do
        docker exec -t `docker inspect -f '{{.Id}}' yz-mysql` mysql -h localhost -uroot -p123456 -e "show databases;"
        if [ $? -eq 0 ]; then
            echo "mysql容器服务检测OK！！！"
            break
        fi
        sleep 3
        count=`expr $count + 1`
        if [ $count -eq $max_count ];then
            exit_on_err 1 "mysql组件服务检测失败！！"
        fi
    done

	#创建测试库yztest
	docker exec -t `docker inspect -f '{{.Id}}' yz-mysql` mysql -h localhost -uroot -p123456 -e "Create Database If Not Exists ${DB_NAME} Character Set utf8mb4;"
	if [ $? -eq 0 ]; then
	    echo "创建应用数据库${DB_NAME}成功！！"
	else
	    exit_on_err 1 "创建应用数据库${DB_NAME}失败！！"
	fi

    #输出mysql启动信息
    echo "mysql  Ver 14.14 Distrib 5.6.47"
    echo "mysql连接信息：host主机:localhost，端口:3306，密码：123456"
    echo "创建应用数据库：${DB_NAME}"
    echo "连接串: mysql -h localhost -uroot -p123456"

}

main "${@}"
