#!/bin/bash

#######################################################
#   変数の準備
#######################################################


# リストに変換するテキストファイル
datadir=$(cd $(dirname "$0") && pwd)/bean_pkginst_files
catalog=$(cat ${datadir}/catalog.txt)

# 共通関数の読み込み
. ${datadir}/common.fnc

# テキストファイルの行数（ループの脱出判定に使用）
linecount=$(echo "$catalog" | wc -l)

# 表示に使用するリスト
display=""

# 変更箇所の検出に使用するリスト
before=""

# 改行
BR="
"


#######################################################
#  テキストファイルをリスト形式に変換
#######################################################


_txt2list()
{
	echo 0
	
	# 区切り文字を改行に
	_IFS="$IFS";IFS="$BR"
	
	# パッケージセットのリストを作成
	i=0
	while [ $linecount -gt $i ] ; do
		
		# 必要な情報を取り出す
		name=$(echo "$catalog" | sed -n "$(expr $i + 1)p")
		pow=$( echo "$catalog" | sed -n "$(expr $i + 2)p")
		desc=$(echo "$catalog" | sed -n "$(expr $i + 3)p")
		id=$(  echo "$catalog" | sed -n "$(expr $i + 4)p")
		
		# 表示用と比較用のリストを生成する
		display="${display}$(${datadir}/${id} -c)${BR}${name}${BR}${pow}${BR}${desc}${BR}${id}${BR}"
		before="${before}$(${datadir}/${id} -c)|${name}|${pow}|${desc}|${id}|${BR}"
		i=$(expr $i + 5)
		
	done
	
	# 区切り文字を戻す
	IFS="$_IFS"
	
	echo "${display}" > "/tmp/_pkginstall_display"
	echo "${before}"  > "/tmp/_pkginstall_before"
}
_txt2list | \
yad --title="起動中" --on-top --center --window-icon=checkbox --image=checkbox \
--text "インストール状態を確認しています..." --progress --pulsate --auto-close

display=$(cat "/tmp/_pkginstall_display")
before=$(cat "/tmp/_pkginstall_before")

# 一時ファイルを削除
rm -f "/tmp/_pkginstall_display"
rm -f "/tmp/_pkginstall_before"


#######################################################
#  リストから変更したい項目を選択
#######################################################


# リストを表示
after=$(
	echo "$display" | yad \
	--plug=114514 --tabnum=1 \
	--list --checklist --hide-column="5" \
	--text="導入したい機能にチェックを入れてください（チェックを外したものは削除されます）。" \
	--column="導入" --column="パッケージ名" --column="負荷" --column="説明" --column="ID" &

	yad --plug=114514 --tabnum=2 \
	--text "\n<span weight='bold' size='large' foreground='#FFFFFF' background='#000000'>「負荷」表示の意味\n\n</span><b>無</b>： 設定変更だけで済むような単純な項目\n\n<b>微</b>： HDD容量をほとんど消費せず、常駐プロセスがメモリ・CPUに負荷を与えないもの\n\n<b>弱</b>： 数十MBのHDD容量を消費する、あるいは常駐プロセスが多少目につくレベルでメモリを消費するもの\n\n<b>中</b>： 数百MB以上もHDD容量を消費したり、高負荷時に邪魔になる程度のメモリを消費するもの\n\n<b>強</b>： ロースペック機で起動が大きく遅れたり、常駐することで各所に不具合を出す可能性があるもの\n\n<b>激</b>： 操作不能になるほどCPUに負荷を与えたり、HDD容量を限界まで食い尽くす可能性があるもの\n\n<b>注意</b>： 「特定の機種で起動しなくなる」など、何らかのリスクを抱えているもの" &
	
	yad --key=114514 \
	--width="640" --height="480" --on-top --center \
	--title="linuxBean 設定ウィザード" --window-icon=checkbox \
	--notebook --tab="パッケージ" --tab="情報"
)

# キャンセルした場合は終了
if [ $? -gt 0 ] ; then
	exit 1
fi


#######################################################
#  変更箇所の検出・パース
#######################################################


# リストを比較するための一時ファイルを作成
echo "${before}" > "/tmp/_pkginstall_before"
echo "${after}"  > "/tmp/_pkginstall_after"

# 操作前のリストと操作後のリストを比較し、それぞれの変更箇所を取り出す
diff=$(diff "/tmp/_pkginstall_before" "/tmp/_pkginstall_after" | grep ^.\ TRUE\|)

# 一時ファイルを削除
rm -f "/tmp/_pkginstall_before"
rm -f "/tmp/_pkginstall_after"

if [ "${diff}" == "" ] ; then
	exit 1
fi
in=$( echo "$diff" | grep ^\> | sed -e 's/^> //')
out=$(echo "$diff" | grep ^\< | sed -e 's/^< //')


# 確認用のリストを作成・表示
if [ ! "${in}" == "" ] ; then
	in_disp=${BR}" 【インストール】"${BR}$(echo "$in" | awk -F"|" '{print "  "$2}')${BR}
else
	in_disp=""
fi
if [ ! "${out}" == "" ] ; then
	out_disp=${BR}" 【アンインストール】"${BR}$(echo "$out" | awk -F"|" '{print "  "$2}')${BR}
else
	out_disp=""
fi

yad --title="linuxBean 設定ウィザード" --on-top --center --window-icon=checkbox --image=checkbox \
--text "${BR} 以下の変更を適用しますか？${BR}${in_disp}${out_disp} "

# キャンセルした場合は終了
if [ $? -gt 0 ] ; then
	exit 1
fi

# 処理用のリストを作成
in_list=$( echo "$in"  | awk -F"|" '{print $5}')
out_list=$(echo "$out" | awk -F"|" '{print $5}')


#######################################################
#  インストールと後処理
#######################################################


# 残りの処理は別窓に渡す
x-terminal-emulator -e "${datadir}/doinst" "$(echo ${in_list} \| ${out_list})"

# 終了待ち
while true ; do
	if [ $(ps alxxx | grep bean_pkginst_files/doinst | grep -v grep | wc -l) -eq 0 ] ; then
		break
	fi
	sleep 1
done

# ログを開く
nohup leafpad $(_logfile) &

# 区切り文字を改行に
_IFS="$IFS";IFS="$BR"

# ファイルに記録されたコマンドを立ち上げる
for line in $(cat "$(_postfile)") ; do
	if [ "a${line}" != "a" ] ; then
		eval nohup ${line} &
	fi
done

# 区切り文字を戻す
IFS="$_IFS"

# 記録ファイルを削除する
rm -f "$(_postfile)"
