#!/usr/bin/env bash
# **********************************************************************************************************************
# 一键初始化项目
# **********************************************************************************************************************
# 获取当前脚本所在目录作为工作目录
WORKDIR=$(cd "$(dirname "$0")" || exit; pwd)
cd "$WORKDIR" || exit
echo "工作目录：$PWD"
USER_HOME="$HOME" # 用户主目录
M2_HOME="${USER_HOME}/.m2"

# 检查并创建.m2目录
if [ ! -d "$M2_HOME" ]; then
  mkdir -p "$M2_HOME"
fi
# 切换到.m2目录
cd "$M2_HOME" || exit
OS='' # 操作系统类型
# 判断操作系统类型
case "$(uname -s)" in
  Linux*)     OS=linux ;;
  Darwin*)    OS=macos ;;
  CYGWIN*|MINGW*|MSYS*)
    OS=windows
  ;;
  *)          echo "未适配操作系统：$(uname -s)"; exit 1 ;;
esac
echo "OS=$OS"

rm -rf code-template
# 克隆代码模板
git clone https://gitlab.51tests.net/code-projects/server.git code-template
# 进入代码模板目录
cd code-template || exit

GIT_COMMIT_ID=$(git reflog | head -n 1 | awk '{print $1}')
# 基于代码模板检出无提交记录的新分支
git checkout --orphan clone-master

# 查看 mvn 环境
./mvnw -v || exit

sleep 1

JAVA_VERSION_MVN=$(./mvnw -v 2>&1 | awk -F '"' '/openjdk version/ {print $2}')
# 从pom.xml中获取java版本号
JAVA_VERSION_POM=$(grep '<java.version>' pom.xml | awk -F'[<>]' '{print $3}')
echo "java version 匹配：${JAVA_VERSION_MVN:-mvn} startsWith ${JAVA_VERSION_POM:-pom}"

if [[ "${JAVA_VERSION_MVN:-mvn}" != "${JAVA_VERSION_POM:-pom}"* ]]; then
  echo "项目依赖的 JDK 版本【${JAVA_VERSION_POM}】与 mvnw 配置的版本【${JAVA_VERSION_MVN}】不一致"
  exit
fi

# 应用模型
#APP_MODE=0
#APP_MODE_COMMENT=单体应用
#read -r -p "$(echo -e "请选择初始化应用模型【0：单体应用，1：微服务】=(默认值：0): ")" INPUT
#if [[ $INPUT != '' ]]; then
#  APP_MODE=$INPUT
#  if [[ $INPUT != '0' ]]; then
#    APP_MODE_COMMENT=微服务
#  fi
#fi

# 应用名，项目名
APP_NAME=java-demo
read -r -p "$(echo -e "应用名 spring.app.name=(默认值：$APP_NAME): ")" INPUT

if [[ $INPUT != '' ]]; then
  APP_NAME=$INPUT
fi

AppName=$(echo "$APP_NAME" | perl -pe 's/(^|-|_)(\w)/\U\2/g')
app_name=$(echo "$APP_NAME" | perl -pe 's/[-_]/_/g')
AppDir=$(echo "$APP_NAME" | perl -pe 's/[-_]/\//g')

# git 仓库地址
GIT_REPOSITORY=''
echo '新项目 git 仓库地址，最好带上登录账号（如：https://登录账号@gitlab.51tests.net/xxx/xxx.git），避免多账号情况下默认账号没有仓库权限。如果只有一个账号情况可以忽略这条提示。'
read -r -p "$(echo -e "新项目 git 仓库地址=: ")" INPUT
if [[ $INPUT != '' ]]; then
  GIT_REPOSITORY=$INPUT
fi

# git 分支
GIT_BRANCH=master
read -r -p "$(echo -e "新项目 git 仓库分支=(默认值：$GIT_BRANCH): ")" INPUT
if [[ $INPUT != '' ]]; then
  GIT_BRANCH=$INPUT
fi

# 项目包名前缀
MAVEN_GROUP_ID=com.$(echo "$APP_NAME" | perl -pe 's/(-|_)/./g')
read -r -p "$(echo -e "pom 文件 groupId=(默认值：$MAVEN_GROUP_ID): ")" INPUT
if [[ $INPUT != '' ]]; then
  MAVEN_GROUP_ID=$INPUT
fi

echo "
# 初始化参数 *************************************************************************************************************
spring.app.name=$APP_NAME                  # 应用名
pom.xml.groupId=$MAVEN_GROUP_ID            # pom 文件 groupId (应用包名前缀)
# **********************************************************************************************************************
项目初始化完成后，本地启动服务需要修改 application-local.yml
spring.datasource.spring.datasource.url =  # mysql 数据库地址、端口、数据库名
spring.datasource.username =               # mysql 数据库用户名
spring.datasource.password =               # mysql 数据库密码
spring.data.redis.host =                   # redis 地址
spring.data.redis.port =                   # redis 端口
spring.data.redis.password =               # redis 密码
# **********************************************************************************************************************
"

read -r -p "$(echo -e "按 enter 键继续（ctrl - c 退出） ")" INPUT
if [ "$APP_NAME" != 'app-demo' ]; then
  echo '开始初始化代码'
  #find ./ -name querydsl | xargs rm -rf
  # 清除 querydsl 编译出来的文件
  find ./ -type d -name javar -exec rm -rf {} +

  mkdir -p "app-starter/src/main/java/com/$AppDir/" && mv app-starter/src/main/java/com/ccx/demo/* "app-starter/src/main/java/com/$AppDir/"

  # https://perl-book.junmajinlong.com/ch6/3_perlre_modifiers.html
  mv app-demo/src/main/java/com/ccx/demo/AppDemoApplication.java "app-demo/src/main/java/com/ccx/demo/${AppName}Application.java"
  mkdir -p "app-demo/src/main/java/com/$AppDir" && mv app-demo/src/main/java/com/ccx/demo/* "app-demo/src/main/java/com/$AppDir/"
  mv app-demo "$APP_NAME"
  for dir in examples/*; do
    [ -d "$dir" ] || continue
    echo "examples 目录：${dir}/src/main/java/com/$AppDir"
    mkdir -p "${dir}/src/main/java/com/$AppDir" && mv "${dir}/src/main/java/com/ccx/demo"/* "${dir}/src/main/java/com/$AppDir/"
  done

  if [ ! -d logs ]; then
    mkdir logs
  fi
  if [ -f logs/filepath.log ]; then
    rm -rf logs/filepath.log
  fi

  for endsWith in java xml js yml yaml properties http sql conf ini env sh md imports toml
  do
    echo "收集文件：${endsWith}"
    #find ./ -type f -regex ".*\.java$" | grep -v git | grep -v idea | grep -v logs  | grep -v node_modules | grep -v target | grep -v cli.sh > logs/filepath.log
    find ./ -type f -regex ".*\.${endsWith}$" | grep -v git | grep -v idea | grep -v logs  | grep -v node_modules | grep -v target | grep -v cli.sh >> logs/filepath.log
  done
  echo "内容替换：app-demo => ${APP_NAME}"
  xargs perl -pi -e "s/app-demo/$APP_NAME/g" < logs/filepath.log
  echo "内容替换：app_demo => ${app_name}"
  xargs perl -pi -e "s/app_demo/$app_name/g" < logs/filepath.log
  echo "内容替换：AppDemo => ${AppName}"
  xargs perl -pi -e "s/AppDemo/$AppName/g" < logs/filepath.log
  echo "内容替换：com.ccx.demo => ${MAVEN_GROUP_ID}"
  xargs perl -pi -e "s/com.ccx.demo/$MAVEN_GROUP_ID/g" < logs/filepath.log
#  while read -r file; do
#    perl -pi -e "s/com.ccx.demo/$MAVEN_GROUP_ID/g" "$file"
#  done < logs/filepath.log
  mv doc/docker/nginx/conf.d/app-demo.51shanjian.cn.conf doc/docker/nginx/conf.d/"$APP_NAME".51shanjian.cn.conf
  mv doc/docker/nginx/app-demo.51shanjian.cn.upgrade.sh doc/docker/nginx/"$APP_NAME".51shanjian.cn.upgrade.sh
fi

#GIT_REPOSITORY=git@gitlab.51tests.net:xiechangchun/test.git
#GIT_BRANCH=$(date +'%m%d%H%M')

if [[ "$GIT_REPOSITORY" == '' ]]; then
  echo '未指定git仓库地址，无法自动推送代码'
else
  GIT_USER_EMAIL=$(git config --global user.email)
  GIT_USER_NAME=$(git config --global user.name)
  if [ -z "$GIT_USER_EMAIL" ] || [ -z "$GIT_USER_NAME" ]; then
    echo "
请先执行这两行命令配置 git 全局仓库，再继续。
git config --global user.email 'you@mail.com'
git config --global user.name 'Your Name'
    "
    read -r -p "$(echo -e "按 enter 键继续（ctrl - c 退出） ")" INPUT
  fi
  echo "
# git仓库信息确认 *******************************************************************************************************
新项目 git 仓库地址（git.repository） ：$GIT_REPOSITORY
新项目 git 仓库分支（git.branch）     ：$GIT_BRANCH
项目初始化操作人邮箱（git.user.email） ：$(git config --global user.email)
项目初始化操作人姓名（git.user.name）  ：$(git config --global user.name)
# *********************************************************************************************************************
"
  read -r -p "$(echo -e "按 enter 键继续（ctrl - c 退出） ")" INPUT
  echo '开始提交并推送代码'
#  # 提交代码
#  git add . && git commit -m "初始化QueryDSL查询实体"
  # 添加新项目仓库地址
  git remote add code-origin "$GIT_REPOSITORY"
  # 提交代码， mvn compile 需要 git commit 记录，所以需要先提交一次
  git add .
  git commit -m "初始化$GIT_COMMIT_ID"
fi

./mvnw clean compile || exit

git add . && git commit -m "初始化 QueryDSL 查询实体"

# 推送到指定分支， 本地分支:远程分支
git push --set-upstream code-origin "clone-master:$GIT_BRANCH"

#find ./ -name *.iml | xargs rm -rf
#rm -rf .idea

cd "$WORKDIR" || exit
# 清理 clone 的代码模板
rm -rf "$M2_HOME/code-template"
# 清理 cli 脚本
rm -rf "$WORKDIR/cli.sh"

# 达梦数据库命名规范
#find ./ -type d -name entity | grep 'src/main/java/'
#find examples/app-dameng/src/main/java/com/ccx/demo/business/*/entity/ -type f -name "*.java" -exec perl -i -pe 's{@Column\(\s*name\s*=\s*"([^"]+)"}{my $n = $1; $n =~ s/([a-z])([A-Z])/$1_\L$2/g; "@Column(name = \"$n\""}ge' {} \;
#find examples/app-dameng/src/main/java/com/ccx/demo/business/*/entity/ -type f -name "*.java" -exec perl -i -pe 's{(\@Column\(\s*name\s*=\s*")([^"]+)(")(.*?\))}{$1\U$2\E$3$4}g' {} \;
