SYNOPKG_PKGNAME="${SYNOPKG_PKGNAME:-NoteStation}"
PACKAGE_DIR="/var/packages/${SYNOPKG_PKGNAME}"
PKG_APP_PATH="${PACKAGE_DIR}/target/ui"
PLUGIN_PATH="${PKG_APP_PATH}/js/tinymce_plugins"
CORE_PATH="${PKG_APP_PATH}/js/TinyMCE"
LIB_PATH="${PACKAGE_DIR}/target/lib"
TOOL_PATH="${PACKAGE_DIR}/target/tools"
TINYMCE_CORE_PATH="/usr/syno/synoman/webman/modules/TinyMCE"
TINYMCE_PLUGIN_PATH="$TINYMCE_CORE_PATH/js/tinymce/plugins/"
PACKAGE_WEBAPI_DIR="${PACKAGE_DIR}/target/webapi"
PACKAGE_API_FILE="SYNO.NoteStation.lib"
SYSTEM_WEBAPI_DIR="/usr/syno/synoman/webapi"

# notestation.auth
WEBAPI_AUTH_DIR="${PACKAGE_DIR}/target/etc"
WEBAPI_AUTH_FILE="notestation.auth"

PACKAGE_TINYMCE_HDPACK_PATH="${PKG_APP_PATH}/js/TinyMCE_synohdpack"
TINYMCE_HDPACK_PATH="/usr/syno/synoman/synohdpack/images/dsm/modules/TinyMCE"

HOOK_LIB_PATH="${PACKAGE_DIR}/target/hook/NoteStation.lib"
SYNODRIVE_HOOK_PATH="/usr/local/libexec/synodrive/"
SYNODRIVE_HOOK_LIB_PATH="${SYNODRIVE_HOOK_PATH}/NoteStation.lib"

SYNODRIVE_FILE="libsynodrive.so"
SYNODRIVE_FILE_5_0="libsynodrive.so.5.0"
SYNODRIVE_TOOLS="synodriveindex synodriveobject synodrivesettings synodrivetest synodriveversion synodriveencode synodrivehook"
SYNODRIVE_FILE_AND_LINK="${SYNODRIVE_FILE} libsynodrive.so.5 libsynodrive.so.5.0"

NOTE_BIN="${TOOL_PATH}/synonsnote"
CONVERT_BIN="${TOOL_PATH}/synonsconvert"
FTS_CONVERT_BIN="${TOOL_PATH}/synonsftsconvert"
INDEX_BIN="${TOOL_PATH}/synodriveindex"
FTS_BIN="${TOOL_PATH}/synonsfts"
IMPORT_BIN="${TOOL_PATH}/synonsimport"
COMMON_BIN="${TOOL_PATH}/synonscommon"
TODO_BIN="${TOOL_PATH}/synonstodo"
ATTACHMENT_BIN="${TOOL_PATH}/synonsattachment"
REPO_BIN="${TOOL_PATH}/synonsrepo"
DRIVE_SETTING_BIN="${TOOL_PATH}/synodrivesettings"
DRIVE_VOLUME_BIN="${TOOL_PATH}/synodrivevolume"
REPO_BIN="${TOOL_PATH}/synonsrepo"
TODO_BIN="${TOOL_PATH}/synonstodo"
LN_BIN="/bin/ln"
RM_BIN="/bin/rm"
MV_BIN="/bin/mv"
SU_BIN="/bin/su"
CP_BIN="/bin/cp"
KILLALL_BIN="/usr/bin/killall"
CHOWN_BIN="/bin/chown"
SH_BIN="/bin/sh"
STAT_BIN="/bin/stat"
CHMOD_BIN="/bin/chmod"
FIND_BIN="/bin/find"
MKDIR_BIN="/bin/mkdir"

# pgsql related
PSQL="/usr/bin/psql"
DB_NAME="notestation"
DB_USER="NoteStation"
DB_CREATE_SCRIPT="${PACKAGE_DIR}/scripts/create_table.sql"
DB_TIME_SCRIPT="${PACKAGE_DIR}/scripts/fix_table_time.sql"

DB_DIR="${PACKAGE_DIR}/target/db"

SETTING_DIR="${PACKAGE_DIR}/target/etc"
USER_SETTING_PREIFX="setting.json."

# permission related
NS_USER="NoteStation"
NS_GROUP="NoteStation"

CreateTinyMCELink()
{
	if [ ! -d "${TINYMCE_CORE_PATH}" ]; then
		${LN_BIN} -sf ${CORE_PATH} ${TINYMCE_CORE_PATH}
	fi

	if [ ! -d "${TINYMCE_HDPACK_PATH}" ]; then
		${LN_BIN} -sf ${PACKAGE_TINYMCE_HDPACK_PATH} ${TINYMCE_HDPACK_PATH}
	fi
}

RemoveTinyMCELink()
{
	if [ -L "${TINYMCE_CORE_PATH}" ]; then
		${RM_BIN} -f ${TINYMCE_CORE_PATH}
	fi

	if [ -L "${TINYMCE_HDPACK_PATH}" ]; then
		${RM_BIN} -f ${TINYMCE_HDPACK_PATH}
	fi
}

CreatePluginsLink()
{
	LIST=`ls -d ${PLUGIN_PATH}/*`

	for plugin in ${LIST}; do
		${LN_BIN} -sf ${plugin} ${TINYMCE_PLUGIN_PATH}
	done
}

RemovePluginsLink()
{
	LIST=`ls ${PLUGIN_PATH}`
	for plugin in ${LIST}; do
		${RM_BIN} -f ${TINYMCE_PLUGIN_PATH}/${plugin}
	done
}

CreateWebapiLink()
{
	${LN_BIN} -sf ${PACKAGE_WEBAPI_DIR}/${PACKAGE_API_FILE} ${SYSTEM_WEBAPI_DIR}/${PACKAGE_API_FILE}
}

RemoveWebapiLink()
{
	${RM_BIN} -rf ${SYSTEM_WEBAPI_DIR}/${PACKAGE_API_FILE}
}

CreateNoteStationAuth()
{
	${LN_BIN} -sf ${WEBAPI_AUTH_DIR}/${WEBAPI_AUTH_FILE} ${SYSTEM_WEBAPI_DIR}/${WEBAPI_AUTH_FILE}
}

RemoveNoteStationAuth()
{
	${RM_BIN} -f ${SYSTEM_WEBAPI_DIR}/${WEBAPI_AUTH_FILE}
}

FixTimeRange()
{
	# fix ctime/mtime range
	$SU_BIN $NS_USER -s $SH_BIN -c "$PSQL -d $DB_NAME < $DB_TIME_SCRIPT"
}

CreateTable()
{
	# Check database schema match or not
	${COMMON_BIN} --check_schema
	if [ "$?" = "0" ]; then
		FixTimeRange
		return
	fi

	# clear old table
	DropTable

	# create note station table
	$SU_BIN $NS_USER -s $SH_BIN -c "$PSQL -d $DB_NAME < $DB_CREATE_SCRIPT"

	# enable access
	$DRIVE_SETTING_BIN --access enable=1
	$DRIVE_SETTING_BIN --access enable=1 ns=NoteStation pkg_id=NoteStation

	# reindex synodrive
	$INDEX_BIN --reindex ns=NoteStation

	# reindex notestation
	$CONVERT_BIN --index

	# reindex fts
	ReindexFts
}

ReindexFts()
{
	if [ ! -d "${DB_DIR}" ]; then
		$SU_BIN $NS_USER -s $SH_BIN -c "${MKDIR_BIN} ${DB_DIR}"
	fi

	$SU_BIN $NS_USER -s /bin/sh -c "$FTS_BIN --init"
	nohup $FTS_CONVERT_BIN --index &
}

DropTable()
{
	$KILLALL_BIN -9 synonsftsconvert
	$RM_BIN -f ${DB_DIR}/*.db
	$PSQL -U postgres -d $DB_NAME -c "drop schema public cascade;"
	$SU_BIN $NS_USER -s $SH_BIN -c "$PSQL -d $DB_NAME -c 'create schema public;'"
}

CreateHookLink()
{
	if [ ! -d ${SYNODRIVE_HOOK_PATH} ]; then
		${MKDIR_BIN} -p ${SYNODRIVE_HOOK_PATH}
	fi

	${LN_BIN} -sf ${HOOK_LIB_PATH} ${SYNODRIVE_HOOK_LIB_PATH}
}

RemoveHookLink()
{
	${RM_BIN} -f ${SYNODRIVE_HOOK_LIB_PATH}
}

CreatePackageHash()
{
	${COMMON_BIN} --gen_package_hash
}

RemoveConf()
{
	${RM_BIN} -f ${PACKAGE_DIR}/etc/conf
}

RemoveImportProcess()
{
	LIST=`cat /tmp/synons_import_pid_*`
	for var in $LIST;
	do
		/bin/kill -9 $var
	done

	$RM_BIN /tmp/synons_import_pid_*
}

ResumeImportProcess()
{
	$IMPORT_BIN --resume_evernote
}

StartTodoDaemon()
{
	$TODO_BIN --time_daemon op=restart
}

StopTodoDaemon()
{
	$TODO_BIN --time_daemon op=stop
}

InstallNoteStationSetting()
{
	$COMMON_BIN --setup_ns
}

CorrectRepoPerm()
{
	local path=`$REPO_BIN --get`
	local owner=`$STAT_BIN -c %u $path`
	local access=`$STAT_BIN -c %a $path`

	if [ "0" != "$owner" ]; then
		$CHOWN_BIN root $path
	fi

	if [ "700" != "$access" ] ; then
		$CHMOD_BIN -R 700 $path
	fi
}

EnableSynoDrive()
{
	$DRIVE_SETTING_BIN --access enable=1
	$DRIVE_SETTING_BIN --access enable=1 ns=NoteStation pkg_id=NoteStation git="{\"pack_duration_time\":60,\"pack_no_delta\":{\"text\":{\"encrypt\":true}}}"
}

DisableSynoDrive()
{
	$DRIVE_SETTING_BIN --access enable=0 ns=NoteStation
}

CorrentSettingOwner()
{
	$FIND_BIN $SETTING_DIR -name "setting.json.*" -type f -uid 0 -exec $CHOWN_BIN $NS_USER:$NS_GROUP {} \;
}

RegisterVolume()
{
	$MKDIR_BIN -p "${PACKAGE_DIR}/etc/synopkg_conf"
	$TOOL_PATH/synonspkg --update_reg_volume
}

checkReindexFts()
{
	local IFS='.'
	local version=($SYNOPKG_NS_OLD_FEATURE_VER)
	local threshold_version="2.5.3"
	threshold_version=($threshold_version)
	for ((i=0; i<${#threshold_version[@]}; i++))
	do
		if ((10#${version[i]} > 10#${threshold_version[i]}))
		then
			break;
		fi
		if ((10#${version[i]} < 10#${threshold_version[i]}))
		then
			ReindexFts
			break;
		fi
	done
}
