# shellcheck shell=sh
# shellcheck disable=SC2034
# shellcheck disable=SC2059

# ferreus_orbit Plugins for GIGABYTE "MZ01-CE1-00"

fo_get_sorted_name(){
  if [ "$USE_FO_NAME" -eq 1 ] || [ "$1" = "-f" ]; then
    draw=$(fo_get_ctl)
    num=$(fo_get_slot "$draw")
    if [ -z "${draw}" ]; then
      echo "Disk${num}"
    else
      echo "Drawer${draw}-Disk${num}"
    fi
  else
    id=$(fo_get_id)
    echo "sd$(fo_get_dev_letter "${id}")"
  fi
}

fo_get_did(){
  fo_get_id "$1"
}

fo_get_ctl(){
  host=$(echo "$DEVPATH" | cut -d/ -f6)
  case "$host" in
    ata*)
      exit 0
      ;;
    *)
      pci=$(echo "$DEVPATH" | cut -d/ -f5 |cut -d: -f2)
      jq -r ".|select(.\"PCI Address\"==\"00:${pci}:00:00\").Controller" "${FO_CACHE_FILE_STORCLI}"
      exit 0
      ;;
  esac
}

fo_get_slot(){
  host=$(echo "$DEVPATH" | cut -d/ -f6)
  case "$host" in
    ata1|ata13)
      ata=$(echo "${host}" |awk -F'ata' '{print $2}')
      echo 0
      ;;
    ata2|ata14|ata16)
      ata=$(echo "${host}" |awk -F'ata' '{print $2}')
      echo 1
      ;;
    *)
      ctl=$1
      # shellcheck disable=SC2086
      idx_dev=$(fo_array_get_idx "$DEVNAME" $fo_data_disks)
      did=$(( idx_dev % 8))
      fo_raid_path=$(jq -r ".|select(.!=null)
                |to_entries[]
                |select(.key|tostring|startswith(\"Drive /c${ctl}/\"))
                  |select(.key|tostring|endswith(\"Information\")|not)
                    |select(.value[].DID == ${did}).key" \
        "${FO_CACHE_FILE_STORCLI}" 2>/dev/null|cut -d' ' -f2)
       jq -r ".\"Drive ${fo_raid_path} - Detailed Information\"
                .\"Drive ${fo_raid_path} Policies/Settings\"
                  |select(.!=null)
                  .\"Connected Port Number\"" \
        "${FO_CACHE_FILE_STORCLI}" 2>/dev/null | cut -d'(' -f1 | cut -d' ' -f1
      ;;
    esac
}

fo_get_id() {
  ctl=$(fo_get_ctl)
  slt=$(fo_get_slot "$ctl")
  if [ -z "$ctl" ]; then
    echo "$slt"
  else
    echo $(( (ctl * 8) + slt + 2 ))
  fi
}

fo_get_kname(){
  ctl=$(echo "$2" |cut -d/ -f2| awk -F 'c' '{print $2}')
  slt=$(jq -r ".\"Drive ${2}\"|select(.!=null)[].DID" "${FO_CACHE_FILE_STORCLI}")
  ascii=$(( (ctl * 8) + slt))
  # shellcheck disable=SC2086
  dev=$(fo_array_get_value "$ascii" $fo_data_disks)
  basename "$dev" 
}

fo_get_foname(){
  ctl=$(echo "$1" |cut -d/ -f2| awk -F 'c' '{print $2}')
  slt=$(jq -r ".\"Drive ${1} - Detailed Information\"
                .\"Drive ${1} Policies/Settings\"
                  |select(.!=null)
                  .\"Connected Port Number\"" \
       "${FO_CACHE_FILE_STORCLI}" 2>/dev/null | cut -d'(' -f1 | cut -d' ' -f1)
  echo "Drawer${ctl}-Disk${slt}"
}

fo_write_by_fo_name(){
  name=$(basename "$1")
  if [ "${#name}" -le 4 ]; then
    id=$(fo_get_dev_ascii "$name")
    ctl=$(((id - 2) / 8))
    slt=$((id - (ctl * 8) - 2))
  else
    ctl=$(echo "$name"|sed -e 's/[^0-9]/ /g'|awk '{print $1}')
    slt=$(echo "$name"|sed -e 's/[^0-9]/ /g'|awk '{print $2}')
  fi
  fo_raid_path=$(jq -r ".|select(.!=null)[]
                            |to_entries[]|
                              select(.key|tostring|endswith(\"/Settings\"))
                                |select(.key|contains(\"/c${ctl}/\"))|
                                  select(.value.\"Connected Port Number\"==\"${slt} \").key" \
                  "${FO_CACHE_FILE_STORCLI}" 2>/dev/null)
  if [ -z "$fo_raid_path" ];then
  fo_raid_path=$(jq -r ".|select(.!=null)[]
                            |to_entries[]|
                              select(.key|tostring|endswith(\"/Settings\"))
                                |select(.key|contains(\"/c${ctl}/\"))|
                                  select(.value.\"Connected Port Number\"==\"${slt}(path0) \").key" \
                  "${FO_CACHE_FILE_STORCLI}" 2>/dev/null)
  fi
  fo_raid_path=$( echo "$fo_raid_path" | cut -d' ' -f2)
  fo_drive=$(mktemp)
  fo_jb=$(mktemp)
  jq -r ".|to_entries[]|select(.key==\"Drive ${fo_raid_path}\").value[]" /var/cache/ferreus-orbit/fo_cache_storcli > "$fo_drive"
	jq -r '.|.Type+","+."EID:Slt"+","+(.DID|tostring)+","+.Model+","+.DG+","+.State+","+.Size' "$fo_drive" > "$fo_jb"
  IFS=, read -r type eidslt did model dg state size < "$fo_jb"
  rm "$fo_drive" "$fo_jb"
  fo_drive_detailed="$(mktemp)"
  jq -r ".|to_entries[]|select(.key==\"Drive ${fo_raid_path} - Detailed Information\").value.\"Drive ${fo_raid_path} Device attributes\"|.\"Manufacturer Id\"+\",\"+.SN+\",\"+.\"Firmware Revision\"" "${FO_CACHE_FILE_STORCLI}" > $fo_drive_detailed
  IFS=, read -r vendor sn fw < "$fo_drive_detailed"
  rm "$fo_drive_detailed"
  descr="JBOD: ${state}"
	printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \
		"$slt" \
    "$fo_raid_path" \
		"" \
		"$1" \
		"$name" \
		"" \
		"" \
		"$vendor" \
		"$model" \
		"$sn" \
		"$fw" \
		"$size" \
		"$descr" >> "$FO_CACHE_DISKS_INFOS"
	unset did  name vendor model sn fw size descr
}

FO_DRAWER_DISPOSITION="    /{Drawer{DRAWER}-Disk2}/{Drawer{DRAWER}-Disk3}|{Drawer{DRAWER}-Disk1}@{Drawer{DRAWER}-Disk0}@\
{new_line}   /{SN_Drawer{DRAWER}-Disk2}/{SN_Drawer{DRAWER}-Disk3} | {SN_Drawer{DRAWER}-Disk1}@{SN_Drawer{DRAWER}-Disk0}@\
{new_line}  --{MINUS}---{MINUS}-------{MINUS}---{MINUS}--\
{new_line} /{Drawer{DRAWER}-Disk6}/{Drawer{DRAWER}-Disk7}   |   {Drawer{DRAWER}-Disk5}@{Drawer{DRAWER}-Disk4}@\
{new_line}/{SN_Drawer{DRAWER}-Disk6}/{SN_Drawer{DRAWER}-Disk7}    |    {SN_Drawer{DRAWER}-Disk5}@{SN_Drawer{DRAWER}-Disk4}@\
{new_line}__{UNDERSCORE}___{UNDERSCORE} Drawer {DRAWER} __{UNDERSCORE}___{UNDERSCORE}__"

FO_DISPOSITION="""
HDD disposition (Front Panel)
    __{UNDERSCORE}___{UNDERSCORE}___{UNDERSCORE}___{UNDERSCORE}__
{DRAWER0}
{DRAWER1}
{DRAWER2}

HDD disposition (Rear Panel):
__{UNDERSCORE}___{UNDERSCORE}__
|{Disk0}|{Disk1}|
|{SN_Disk0}|{SN_Disk1}|
¯¯{HIGHER}¯¯¯{HIGHER}¯¯
"""

FO_DRAWER_TEXTILE="|={border: 0;font-family:monospace;}.~nbsp;~nbsp;~nbsp;/\
{new_line}~nbsp;~nbsp;/~nbsp;|{Drawer{DRAWER}-Disk2}|={border: 0;font-family:monospace;border-top:1px solid black}.~nbsp;~nbsp;~nbsp;/\
{new_line}~nbsp;~nbsp;/~nbsp;|{Drawer{DRAWER}-Disk3}|={font-family:monospace;border: 0;border-top:1px solid black}.~nbsp;~nbsp;~brvbar;~nbsp;~nbsp;\
{new_line}~nbsp;~nbsp;~brvbar;~nbsp;~nbsp;|{Drawer{DRAWER}-Disk1}|={font-family:monospace;border: 0;border-top:1px solid black}.!~nbsp;~nbsp;~nbsp;\
{new_line}~nbsp;!~nbsp;~nbsp;|{Drawer{DRAWER}-Disk0}|={font-family:monospace;border: 0;padding:0}.!~nbsp;~nbsp;~nbsp;\
{new_line}~nbsp;!~nbsp;~nbsp;|\
{new_line}|={border: 0;font-family:monospace;}.~nbsp;/~nbsp;~nbsp;\
{new_line}/~nbsp;~nbsp;~nbsp;|{Drawer{DRAWER}-Disk6}|={border: 0;font-family:monospace;border-top:1px solid black}.~nbsp;~nbsp;/~nbsp;\
{new_line}~nbsp;/~nbsp;~nbsp;|{Drawer{DRAWER}-Disk7}|={font-family:monospace;border: 0;;border-top:1px solid black}.~nbsp;~nbsp;~brvbar;~nbsp;~nbsp;\
{new_line}~nbsp;~nbsp;~brvbar;~nbsp;~nbsp;|{Drawer{DRAWER}-Disk5}|={font-family:monospace;border: 0;border-top:1px solid black}.~nbsp;!~nbsp;~nbsp;\
{new_line}~nbsp;~nbsp;!~nbsp;|{Drawer{DRAWER}-Disk4}|={font-family:monospace;border: 0;padding:0}.~nbsp;~nbsp;!~nbsp;\
{new_line}~nbsp;~nbsp;~nbsp;!|\
{new_line}|!9={font-weight:bold;background-color:lightgray}.Drawer {DRAWER}|
"

FO_TEXTILE_NOBORDER="""

h3. HDD disposition (Front Panel)

table{border: 0px}.
{DRAWER0}
{DRAWER1}
{DRAWER2}
"""

FO_TEXTILE="""
h3. HDD disposition (Rear Panel):

|{Disk0}|{Disk1}|
"""

for d in 0 1 2; do
  _fo_drawer=$(printf "${FO_DRAWER_DISPOSITION}"|sed "s/{DRAWER}/${d}/g")
  FO_DISPOSITION=$(printf "${FO_DISPOSITION}"|sed "s%{DRAWER${d}}%${_fo_drawer}%g")
  _fo_drawer_textile=$(printf "${FO_DRAWER_TEXTILE}"|sed "s/{DRAWER}/${d}/g")
  FO_TEXTILE_NOBORDER=$(printf "${FO_TEXTILE_NOBORDER}"|sed "s%{DRAWER${d}}%${_fo_drawer_textile}%g")
done

fo_load_storcli

# shellcheck disable=SC201
exclude=$(ls /dev/sd?[0-9] | awk -F '/dev/sd' '{print $2}'| cut -c1 | sed -z 's/\n/,/g'|sed 's/.$//')
# shellcheck disable=SC2046
# shellcheck disable=SC2086
fo_data_disks=$(ls /dev/sd[!${exclude}])
readonly fo_data_disks

