#!/bin/bash
# original filename: xxq-pgn-update.sh
# 2020-3-03, v0.1
# 2020-3-18, v0.2

APPNAME="xxq-pgn-update"
APPVER="0.2~2020-0318"
APPDESC=""

### HEAD ###
## debug switches
DEBUG=1
DEL_TIMECONTROL=1

UPDATE_EVENT=1
UPDATE_DATE=1

#
EMPTY_BLACK=1
EMPTY_RED=

# tag 210: 指定 EVENT_STR=ZH, 则使用中文文字作为棋局标题

# 
pgnfile=
saveto_dir="$HOME/xboard/xiangqi"
_tmppgn=

newpgn=

declare -i ID COUNT SKIP_COUNT
ID=1 
ID3=	#强制把数字序号 1-99，前面补0变成3位数 001-099

COUNT=1
declare -i SKIP_COUNT 
declare -i COUNT_EVENT COUNT_DATE

SKIP_COUNT=120	#对 PGN 文件中，已经处理过的前面 XX 个对局数据，不再修改

#PGN_SRC='ttxq'	#optional: ttxq, sqyq551
PGN_SRC='sqyq551'

EVENT_0=
EVENT_EN=
EVENT_ZH=
EVENT_STR=

DATE_0=
DATE_STR=

GNAME=	#棋局名(用于 Event 标签)，中文或者英文

declare -a event_linum date_linum

# function 1.
	_usage_cn () {
cat<<EOF
Usage: $APPNAME [选项] PGN文件
  更新/优化 Xboard 中国象棋 PGN 对局/棋谱文件的 Event 赛事和 Date 日期标题

Options:
  -c, --count      检测 PGN 对局/棋谱文件中包含的对局个数
  -sc, --skip-count 数字
      忽略 PGN 对局/棋谱文件中，前面的 X 个对局的 Event 和 Date 标签，不作修改

  -nb, --no-black  清空黑方选手数据 [Black] 标签
  -nr, --no-red    清空红方选手数据 [Red] 标签

  -ud, --update-date     更新日期 [Date] 标签
  -ue, --update-event    更新棋局标题 [Event] 标签

  -sqyq   强制指定 PGN 象棋对局文件的标题文字，为《适情雅趣》残局谱的551局
  -ttxq   强制指定 PGN 象棋对局文件的标题文字，为腾迅天天象棋，残局闯关的360局

  -x, --extra      显示附加功能选项
  --tips           显示 xboard 常用选项和参数
  
  -v, --version    显示版本信息并退出
  -h, --help       显示帮助信息并退出

See also:
     命令: 

Bugs: 
请发送缺陷报告给 Careone <emacslocale@126.com>. 

Homepage: 
https://gitee.com/atzlinux/xboard-xiangqi
EOF
}

### BODY ###

for option in "$@"; do

    	case "$option" in

    	 -h | --help)
	   _usage_cn
	   exit 0 ;;
   
# tag 79:
	 -c | --count)
	   shift
	   echo " counting PGN games in files (count tag [Event \"\"])..."
	   
	   for a in "$@"; do
	     if [ -s "$a" ] && grep "Event " "$a" &>/dev/null; then
	         COUNT_EVENT=`grep "\[Event \"" "$a" | wc -l`
	         COUNT_DATE=`grep "\[Date \"" "$a" | wc -l`
	         echo " * $ID $a"
	         echo -e "   标签 [Event] 计数: 共 $COUNT_EVENT 个\n   标签 [Date] 计数:  共 $COUNT_DATE 个"
	     else
	         echo -e " * $ID (skip): $a"
	        
	     fi
	     
	     let "ID += 1"
	   done
	   exit ;;
	   
# tag 97:
    	 -nb | --no-black)
	   EMPTY_BLACK=1; shift ;;

    	 -nr | --no-red)
	   EMPTY_RED=1; shift ;;
	   
# tag 124:
    	 -ue | --update-event)
	   UPDATE_EVENT=1; shift ;;

    	 -ud | --update-date)
	   UPDATE_DATE=1; shift ;;

	
# tag 132:   
	 -sc | --skip-count)
	   SKIP_COUNT="$2"
	   shift 2 ;;
	
    	 -sqyq) # 强制指定 PGN 象棋文件标题文字，为《适情雅趣》残局谱的551局
    	   PGN_SRC=sqyq
	   shift ;;

    	 -ttxq) # 强制指定 PGN 象棋文件标题文字，为腾迅天天象棋，残局闯关的360局
    	   PGN_SRC=ttxq
	   shift ;;	   
   ##
	   	   
    	 -x | --extra)
	   _option_extra
	   exit 0 ;;
	   
	   	#
    	-v | --version)
	  echo "  $APPNAME $APPVER"
	  exit 0 ;;

    	-*)
	  echo "Unrecognized option \`$option'" 1>&2
	  exit 1 ;;	
	esac
	
done

echo " $APPNAME $APPVER"
echo "   自动更新 Xboard 中国象棋的 PGN 对局/棋谱文件的 [Event] 棋局标签 (自动编号)..."

if [ "$#" -eq 0 ];then
  #pgnfile="$HOME/桌面/xxq-tianTianXQ-cg360_030s.pgn"
  pgnfile="$HOME/桌面/xxq-test.pgn"
else
  pgnfile="$1"
  if [ -s "$pgnfile" ];then
    
    echo -e " `pwd`\n   found PGN file: $pgnfile"
  else echo "  Error (E23): no PGN file found! ($pgnfile)" 1>&2
    exit 1;  
  fi
fi

# tag 172: 把原始 PGN 文件复制为临时文件。这样可以保留原文件
  _tmppgn=`mktemp`.pgn
  
  cp -v "$pgnfile" "$_tmppgn"
  pgnfile="$_tmppgn"

#  
  
    echo " 另存为新的 PGN 文件: $pgnfile"
  
# tag 160: 
# 如果制作象棋古谱，而不是记录象棋赛事，则可以删除某些多余的 TAG 标签行，
# 以减小生成的 PGN 棋谱文件尺寸。
if [ "$DEL_TIMECONTROL" = 1 ]; then
  
  echo " * remove all lines with tag: [TimeControl \"\"] ..."
  sed -i "/\[TimeControl \"/d" "$pgnfile"
fi

#  在删除完多余的 TAG 标签行后，再提取每一局 Event 和 Date 标签所在的行号，保存到数组  
# 读取行号，另存为数组，后续再传递给 sed 
event_linum=( `grep -n "Event " "$pgnfile" | cut -d':' -f1` )
date_linum=( `grep -n "Date " "$pgnfile" | cut -d':' -f1` )

COUNT_EVENT="${#event_linum[@]}"; #let "COUNT -= 1"
COUNT_DATE="${#event_linum[@]}"; #let "COUNT -= 1"

#-----------------------
echo -e " found:  [Event]  = $COUNT_EVENT, [Date] = $COUNT_DATE\n"

# tag 160:

if [ "$EMPTY_BLACK" = 1 ]; then
  _STR="Black"
  echo " * 清空标签内容 [${_STR} \"\"] ..."
  sed -i "/${_STR} /c[${_STR} \"\"]" "$pgnfile"
fi

if [ "$EMPTY_RED" = 1 ]; then
  _STR="Red"
  echo " * 清空标签内容 [${_STR} \"\"] ..."
  sed -i "/${_STR} /c[${_STR} \"\"]" "$pgnfile"
fi

#
for ID in `seq 1 1 $COUNT_EVENT`; do
  let "a = ID - 1"

#
  case "$ID" in
    [1-9][0-9])	ID3="0$ID" ;; 
    [0-9]) ID3="00$ID" ;;
    *) ID3="$ID" ;;
  esac
  
# tag 210: 指定 EVENT_STR=ZH, 则使用中文文字作为棋局标题
  case "$PGN_SRC" in
    ttxq) 
  	EVENT_EN="tianTianXQ-cg360_$ID3"
	EVENT_ZH="天天象棋-闯关360_$ID3"
	EVENT_STR="$EVENT_ZH"
	DATE_STR="cg360.$ID3"
		;;
    sqyq | sqyq551) 
        GNAME="XXXX"
  	EVENT_EN="shiQingYaQu_2009-551_$ID3"
	EVENT_ZH="适情雅趣-$ID3-$GNAME"
	EVENT_STR="$EVENT_ZH"
	#DATE_STR="sqyq551.2009.$ID3"
	DATE_STR="2009"
		;;
    *) 
  	EVENT_EN="xxq_$ID3"
	EVENT_ZH="xxq_$ID3"
	EVENT_STR="$EVENT_EN"
	DATE_STR="xxq.$ID3"
		;;				
  esac

  e="${event_linum[a]}"
  d="${date_linum[a]}"
  
  if [ "$DEBUG" = 1 ]; then
    echo -e "   EVENT_STR:  $EVENT_STR\n   DATE_STR:  $DATE_STR"
    echo -e "   SKIP_COUNT: $SKIP_COUNT" | grep --color=auto SKIP_COUNT
    echo -e "   event_linum[$a]: ${event_linum[a]}\n   date_linum[$a]:  ${date_linum[a]}"
  fi
  DEBUG=0

# tag 265:
      if [ "$UPDATE_DATE" = 1 ]; then
	    sed -i "${d}c\[Date \"$DATE_STR\"\]" "$pgnfile"
      fi

# tag 270:
  if [ "$ID" -le "$SKIP_COUNT" ]; then
    continue;
  else
      if [ "$UPDATE_EVENT" = 1 ]; then
	    sed -i "${e}c\[Event \"$EVENT_STR\"\]" "$pgnfile"
      fi

  fi
  
done


echo -e " Done.\n * show result...\n ---------------- "
#tail -26 "$pgnfile"
sed -n "${e}p" "$pgnfile"
echo " ---------------- "

# tag 191: copy and rename new PGN file to ~/xboard/xiangqi/
# 文件名命名规则参考：数字序号后面加小写字母 p 或者 f 的含义： 
# p = PGN; f = FEN
newpgn="$saveto_dir/xxq-${EVENT_EN}p.pgn"

  if [ ! -d "$saveto_dir" ]; then
    mkdir -p "$saveto_dir"
  fi

echo
echo -e " * backup new PGN file to:\n $newpgn"
  cp -v --backup "$pgnfile" "$newpgn"

sleep 1

mousepad "$newpgn" &
sleep 1
xxq -lg "$newpgn" &
exit

