#!/bin/bash

set -e
#set -x

if [ $(id -u) -ne 0 ]; then
	echo "$0 needs root: please use sudo."
	exit 1
fi

# Source Auxilium (args parser)
. /usr/share/auxilium/auxilium.sh

auxilium_init $(basename $0) -m 'Displays list of devices and their physical location'

auxilium_add locate -s l -t str -m 'A device to locate (/dev/sdx or /dev/disk/fo-sort/Box0'
auxilium_add redmine -s r -t opt -m 'Format for redmine'
auxilium_add field -s f -t str -l "id|businfo|vendor|serial|product|version|physid|descriptions|fo_name" -d "serial" -m 'Field to display under Device Name'
auxilium_add csv  -t opt -m 'Return a CSV formatted list of devices (Fo_name,Kernel_name,Size,Model,Serial,Firmware)'


if [ -f "/usr/share/ferreus-orbit/common.sh" ]; then
	. "/usr/share/ferreus-orbit/common.sh"
else
	. "../share/common.sh"
fi

auxilium_parse "$@"

fo_lock

fo_load_lshw

fo_get_name_by_bus(){
	local businfo="$1"
	local width="$2"
	local locate="False"
	local name=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.businfo==\"${businfo}\").logicalname[1]" 2>/dev/null)
	name=$(basename "${name}")
	if [ -z "$name" ]; then
	  name=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.businfo==\"${businfo}\").logicalname" 2>/dev/null)
	fi
	[ "$(basename "${name}")" == "$MAXILIUM_ARG_locate" ] && locate="True"
  fo_center_align "$name" "$width" "$locate"
}

fo_get_field_by_bus(){
	local businfo="$1"
	local field="$MAXILIUM_ARG_field"
	local width="$2"
	local locate="False"

	local name=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.businfo==\"${businfo}\").logicalname[1]" 2>/dev/null)
	name=$(basename "${name}")
	if [ -z "$name" ]; then
	  name=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.businfo==\"${businfo}\").logicalname" 2>/dev/null)
	fi
	[ "$(basename "${name}")" == "$MAXILIUM_ARG_locate" ] && locate="True"
	if [ "${field}" == "fo_name" ]; then
		local realname=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.businfo==\"${businfo}\").logicalname[0]" 2>/dev/null)
		if [ -z "$realname" ]; then
			realname=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.businfo==\"${businfo}\").logicalname" 2>/dev/null)
		fi
		local f=$(./fo-udev-sorting -F -d "${realname}")
	else
		local f=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.businfo==\"${businfo}\").${field}" 2>/dev/null)
	fi
	fo_center_align "$f" "$width" "$locate"
}

fo_disk_status(){
	if [ -d "/dev/disk/fo-sort" ]; then
		local disk_path="/dev/disk/fo-sort"
	elif [ -d "/dev/disk/oci-sort" ]; then
		local disk_path="/dev/disk/oci-sort"
	else
		local disk_path="/srv/node"
	fi
	for disk in $(ls "${disk_path}"); do
		local realname=$(realpath "${disk_path}/${disk}")
		local status=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.logicalname[]==\"${realname}\")" 2>/dev/null)
		[ -z "$status" ] && status=$(cat ${FO_CACHE_FILE_LSHW}|jq -r ".|select(.logicalname==\"${realname}\")" 2>/dev/null)
		local kname=$(basename ${realname})
		local size=$(echo $status|jq  -rs '.[0].size')
		local model=$(echo $status|jq  -rs '.[0].product')
		local sn=$(echo $status|jq  -rs '.[0].serial')
		local fw=$(echo $status|jq  -rs '.[0].version')
		printf "%s,%s,%s,%s,%s,%s\n" "${disk}" "${kname}" "${size}" "${model}"  "${sn}"  "${fw}"
	done
}

fo_display_array(){
	if [ "$1" == "--header" ]; then
		local header='True'
		shift 1
	elif [ "$1" == "--footer" ]; then
		local footer='True'
		shift 1
	fi
	local fo_name=$1
	local k_name=$2
	local size=$3
	local model=$4
	local sn=$5
	local fw=$6
	[ -n "$MAXILIUM_ARG_redmine" ] && local arrow=' <--'
	if [ -n "${header}" ]; then
		printf -- "_%.0s" $(seq 1 93);echo
		printf -- "|%-11s|%-12s|%-10s|%-20s|%-23s|%-10s|\n" "$fo_name" "$k_name" "$size" "$model" "$sn" "$fw"
		printf -- "|-----------|------------|----------|--------------------|-----------------------|----------|\n"
	elif [ -n "${footer}" ]; then
		printf -- "-%.0s" $(seq 1 93);echo
	elif [ "${fo_name}" == "${MAXILIUM_ARG_locate}" ]; then
		printf -- "${RED}|%-11s|%-12s|%+10s|%-20s|%-23s|%-10s|${NORM}\n" "${fo_name}${arrow}" "/dev/${k_name}" "$(numfmt  --to=iec-i --suffix=B --format=" %6.1f " ${size})" "$model" "$sn" "$fw"
	else
		printf -- "|%-11s|%-12s|%+10s|%-20s|%-23s|%-10s|\n" "$fo_name" "/dev/${k_name}" "$(numfmt  --to=iec-i --suffix=B --format=" %6.1f " ${size})" "$model" "$sn" "$fw"
	fi
}

readonly st=$(fo_disk_status)

if [ -z "$MAXILIUM_ARG_csv" ]; then
	fo_display_array --header "Swift name" "Kernel name" Size Model Serial Firmware
	IFS=$'\n'; for line in ${st}; do
    while IFS=, read -r fo k size model serial firmware
    do
			fo_display_array "$fo" "$k" "$size" "$model" "$serial" "$firmware"
			done <<< $(echo ${line})
	done
	fo_display_array --footer;echo
	get_dispo
else
	echo ${st}
fi