#!/bin/bash
# info: search objects
# options: USER OBJECT [FORMAT]
#
# example: v-search-user-object admin example.com json
#
# This function that allows to find user objects.

#----------------------------------------------------------#
#                Variables & Functions                     #
#----------------------------------------------------------#

# Argument definition
user=$1
object=$2
format=${3-shell}

# Includes
# shellcheck source=/etc/tuliocp/tulio.conf
source /etc/tuliocp/tulio.conf
# shellcheck source=/usr/local/tulio/func/main.sh
source $TULIO/func/main.sh
# load config file
source_conf "$TULIO/conf/tulio.conf"

# Perform verification if read-only mode is enabled
check_tulio_demo_mode

# Json list function
json_list_search() {
	local fields_clean line
	local id_var id_value
	local var value
	local first_object first_field

	fields_clean=$(printf '%s\n' "$fields" | tr '~' ' ' | sed 's/\$//g')

	set -- $fields_clean
	id_var="$1"
	shift

	first_object=1

	echo '{'

	while IFS= read -r line; do
		parse_object_kv_list_non_eval "$line"

		id_value="${!id_var}"
		id_value=$(printf '%s' "$id_value" | sed \
			-e 's/\\/\\\\/g' \
			-e 's/"/\\"/g' \
			-e "s/%quote%/'/g")

		if [ "$first_object" -eq 0 ]; then
			echo ','
		fi
		first_object=0

		printf '\t"%s": {\n' "$id_value"

		first_field=1
		for var in "$@"; do
			value="${!var}"
			value=$(printf '%s' "$value" | sed \
				-e 's/\\/\\\\/g' \
				-e 's/"/\\"/g' \
				-e "s/%quote%/'/g")

			if [ "$first_field" -eq 0 ]; then
				echo ','
			fi
			first_field=0

			printf '\t\t"%s": "%s"' "$var" "${value//,/, }"
		done

		echo
		printf '\t}'
	done < "$conf"

	echo
	echo '}'
}

# Shell list function
shell_list_search() {
	local field var row fields_for_loop
	sep=${sep:-' '}

	fields_for_loop=$(echo "$fields" | tr '~' ' ' | sed 's/\$//g')

	if [ -z "$nohead" ]; then
		echo "$fields_for_loop" | tr ' ' "$sep"
		for field in $fields_for_loop; do
			printf -- "------%s" "$sep"
		done
		echo
	fi

	while read -r line; do
		parse_object_kv_list_non_eval "$line"

		row=''
		for field in $fields_for_loop; do
			if [ -z "$row" ]; then
				row="${!field}"
			else
				row="${row}${sep}${!field}"
			fi
		done

		echo "$row" | sed "s/%quote%/'/g"
	done < "$conf"
}

#----------------------------------------------------------#
#                    Verifications                         #
#----------------------------------------------------------#

check_args '2' "$#" 'USER OBJECT [FORMAT]'
is_format_valid 'user' 'object'
is_object_valid 'user' 'USER' "$user"

#----------------------------------------------------------#
#                       Action                             #
#----------------------------------------------------------#

conf=$(mktemp)
trap 'rm -f $conf' EXIT
i=0
OLD_IFS=$IFS
IFS=$'\n'

# Search query
search=$(grep "$object" \
	$TULIO/data/users/$user/web.conf \
	$TULIO/data/users/$user/dns.conf \
	$TULIO/data/users/$user/dns/*.conf \
	$TULIO/data/users/$user/mail.conf \
	$TULIO/data/users/$user/mail/*.conf \
	$TULIO/data/users/$user/db.conf \
	$TULIO/data/users/$user/cron.conf 2> /dev/null)

for row in $search; do
	# Initialise variable
	key=''
	result=''
	dom_alias=''
	suspended=''
	object_link=''
	object_parent=''
	object_time=''
	object_date=''

	# Parsing result
	type=$(echo $row | cut -f 1 -d : | cut -f 8 -d /)
	data=$(echo $row | cut -f 2,3,4,5 -d :)
	parse_object_kv_list_non_eval "$data"

	# Check WEB domain
	if [ "$type" = 'web.conf' ]; then
		if [ -n "$(echo $DOMAIN | grep $object)" ]; then
			# Check domain alias
			check_alias="$(echo $ALIAS | tr ',' '\n' | grep $object)"
			if [ -n "$check_alias" ]; then
				dom_alias=$(echo $check_alias | tr ' ' ',')
			fi
			key="DOMAIN"
			result="$DOMAIN"
			suspended=$SUSPENDED
			object_time=$TIME
			object_date=$DATE
			((i++))
		else
			check_alias="$(echo $ALIAS | tr ',' '\n' | grep $object)"
			if [ -n "$check_alias" ]; then
				key="DOMAIN"
				result="$DOMAIN"
				object_parent="$DOMAIN"
				dom_alias=$(echo $check_alias | tr ' ' ',')
				suspended=$SUSPENDED
				object_time=$TIME
				object_date=$DATE
				((i++))
			fi
		fi
	fi

	# DNS
	if [ "$type" = 'dns.conf' ]; then
		if [ -n "$(echo $DOMAIN | grep $object)" ]; then
			key="DOMAIN"
			result="$DOMAIN"
			suspended=$SUSPENDED
			object_time=$TIME
			object_date=$DATE
			((i++))
		fi
	fi

	# DNS Records
	if [ "$type" = 'dns' ]; then
		if [ -n "$(echo $RECORD | grep $object)" ]; then
			key="RECORD"
			result="$RECORD.$DOMAIN"
			suspended=$SUSPENDED
			object_link=$ID
			object_parent=$DOMAIN
			object_time=$TIME
			object_date=$DATE
			((i++))
		fi
	fi

	# MAIL
	if [ "$type" = 'mail.conf' ]; then
		if [ -n "$(echo $DOMAIN | grep $object)" ]; then
			key="DOMAIN"
			result="$DOMAIN"
			suspended=$SUSPENDED
			object_time=$TIME
			object_date=$DATE
			((i++))
		fi
	fi

	# Mail Accounts
	if [ "$type" = 'mail' ]; then
		type='mail'
		if [ -n "$(echo $ACCOUNT | grep $object)" ]; then
			key="ACCOUNT"
			dom="$(echo $row | cut -f 1 -d : | cut -f 9 -d / | sed 's/.conf//')"
			result="$ACCOUNT@$dom"
			suspended=$SUSPENDED
			object_link=$ACCOUNT
			object_parent=$dom
			object_time=$TIME
			object_date=$DATE
			((i++))
		fi
	fi

	# DB
	if [ "$type" = 'db.conf' ]; then
		if [ -n "$(echo $DB | grep $object)" ]; then
			key="DATABASE"
			result="$DB"
			suspended=$SUSPENDED
			object_time=$TIME
			object_date=$DATE
			((i++))
		fi
	fi

	# Cron Jobs
	if [ "$type" = 'cron.conf' ]; then
		if [ -n "$(echo $CMD | grep $object)" ]; then
			key="JOB"
			result="$CMD"
			suspended=$SUSPENDED
			object_link=$JOB
			object_parent=$JOB
			object_time=$TIME
			object_date=$DATE
			((i++))
		fi
	fi

	if [ -n "$result" ]; then
		type=$(echo $type | cut -f1 -d \.)
		str="ID='$i' USER='$user' TYPE='$type' KEY='$key'"
		str="$str RESULT='$result' ALIAS='$dom_alias'"
		str="$str LINK='$object_link' PARENT='$object_parent'"
		str="$str SUSPENDED='$suspended' TIME='$object_time'"
		str="$str DATE='$object_date'"
		echo $str >> $conf
	fi
done

IFS=$OLD_IFS

# Defining fileds to select
fields='$ID $USER $TYPE $KEY $RESULT $ALIAS $LINK $PARENT $SUSPENDED $TIME'
fields="$fields \$DATE"

# Listing domains
case $format in
	json) json_list_search ;;
	plain)
		nohead=1
		shell_list_search | tr -s ' '
		;;
	shell)
		fields='$USER~$TYPE~$KEY~$RESULT~$ALIAS'
		sep='~'
		shell_list_search | column -t -s '~'
		;;
	*) check_args '2' '0' 'USER OBJECT [FORMAT]' ;;
esac

rm -f "$conf"

#----------------------------------------------------------#
#                       Tulio                             #
#----------------------------------------------------------#

# Logging
#log_event "$OK" "$ARGUMENTS"

exit
