#!/usr/bin/ksh93

#
# This file is a part of the NsCDE - Not so Common Desktop Environment
# Author: Hegel3DReloaded
# Licence: GPLv3
#

if [ -z $NSCDE_ROOT ]; then
   echo "Error: NSCDE_ROOT is not set. Exiting."
   exit 2
fi

if [ -z $NSCDE_DATADIR ]; then
   echo "Error: NSCDE_DATADIR is not set. Exiting."
   exit 2
fi

type -p fc-list > /dev/null
if (($? != 0)); then
   echo "Error: fc-list command not found."
   exit 3
fi

OIFS="$IFS"
IFS=" "
FONTS=$(fc-list -f '%{+family,style{%{=unparse}}}\n' | sort -u)
FNAMES=$(echo "$FONTS" | awk -F: '{ print $1 }')
FNUMS=$(echo "$FNAMES" | sort -u | grep -n '')

function findfontsets
{
   if [ -z $NSCDE_ROOT ]; then
      echo "No NSCDE_ROOT defined. Exiting."
      exit 2
   fi

   if [ -z $NSCDE_DATADIR ]; then
      echo "No NSCDE_DATADIR defined. Exiting."
      exit 2
   fi

   SysFontsetsOut=$(ls -1 ${NSCDE_DATADIR}/fontsets/*.fontset)
   SysFontsets=$(echo "$SysFontsetsOut" | awk -F "/" '{print $NF}' | sed 's/\.fontset$//g')
   SysFontsetsCnt=$(echo "$SysFontsetsOut" | wc -l)

   if [ -d "${FVWM_USERDIR}/fontsets" ]; then
      ls -1 ${FVWM_USERDIR}/fontsets/*.fontset > /dev/null 2>&1
      if (($? == 0)); then
         UserFontsetsOut=$(ls -1 ${FVWM_USERDIR}/fontsets/*.fontset)
         UserFontsets=$(echo "$UserFontsetsOut" | awk -F "/" '{print $NF}' | sed 's/\.fontset$//g')
         UserFontsetsCnt=$(echo "$UserFontsetsOut" | wc -l)
      else
         UserFontsetsCnt=0
      fi
   fi

   fontsetsnum=$(($SysFontsetsCnt + $UserFontsetsCnt))
}

function fontsetsmenu
{
   IFS="$OIFS"
   findfontsets

   for fontset in $SysFontsets $UserFontsets
   do
      echo -ne "${fontset}|"
   done | sed 's/|$/\n/g'

   echo $fontsetsnum
}

function getfontsetname
{
   findfontsets
   FontsetName=$(echo "$SysFontsets" "$UserFontsets" | tr ' ' '\n' | grep -n '' | egrep "^${FontsetNum}:" | cut -d":" -f2)
   echo $FontsetName
   if [ -s "$NSCDE_DATADIR/fontsets/${FontsetName}.fontset" ]; then
      echo "${NSCDE_DATADIR}/fontsets/"
   elif [ -s "${FVWM_USERDIR}/fontsets/${FontsetName}.fontset" ]; then
      echo "${FVWM_USERDIR}/fontsets/"
   fi
}

function getfontsetnum
{
   findfontsets
   FontsetNum=$(echo "$SysFontsets" "$UserFontsets" | tr ' ' '\n' | grep -n '' | egrep "^[[:digit:]]+:${FontsetFindName}$" | cut -d":" -f1)
   echo $FontsetNum
}

function getfontnumber
{
   echo "$FNUMS" | egrep "^[0-9]{1,}:(.*,)?${SelectedFont}" | cut -d":" -f1 | while read fontnum
   do
      # Handle fonts with aliases separated by a comma
      FontNum=$fontnum
      fnname=$(getfontname $fontnum)
      if [ "${fnname}" == "${SelectedFont}" ]; then
         echo ${fontnum}
      fi
   done
}

function getfontname
{
   echo "$FNUMS" | egrep "^${FontNum}:.*" | cut -d":" -f2 | cut -d"," -f2
}

function styletname
{
   echo "$FNUMS" | egrep "^${FontNum}:.*" | cut -d":" -f2 | cut -d"," -f2
}

fontname=""
fntcnt=0
function menugen
{
   echo "$FNAMES" | sort -u | while IFS=":" read fontname styles
   do
      echo $fontname | grep -q ','
      if (($? == 0)); then
         fontname=$(echo "$fontname" | awk -F"," '{ print $NF }')
      fi
      fontnames="${fontnames}|${fontname}"
      (( fntcnt = fntcnt + 1 ))
   done

   echo "$fontnames" | sed 's/^|//g'
   echo $fntcnt
}

StylesFmt=0
function getfontstyles
{
   stylelist=""
   echo $FONTS | egrep "$SelectedFont" | while IFS=":" read fontname styles
   do
      styles=$(echo $styles | sed 's/style=//g')
      echo $fontname | grep -q ','
      if (($? == 0)); then
         fontname=$(echo "$fontname" | awk -F"," '{ print $NF }')
      fi
      if [[ "$fontname" == "$SelectedFont" ]]; then
         for style in "$styles"
         do
            stylelist="$stylelist, $style"
         done
         # echo "$fontname $stylelist" | tail -1
      fi
   done

   if [ "$StylesFmt" == "menu" ]; then 
      echo "$stylelist" | tr ',' '\n' | sed 's/^\ //g' | egrep -v '^$' | sort -u | awk '{ ORS=""; print $0 "|" }' | sed 's/|$//g'
   elif [ "$StylesFmt" == "total" ]; then
      echo "$stylelist" | tr ',' '\n' | sed 's/^\ //g' | egrep -v '^$' | sort -u | wc -l
   elif [ "$StylesFmt" == "list" ]; then
      echo "$stylelist" | tr ',' '\n' | sed 's/^\ //g' | egrep -v '^$' | sort -u
   fi

   if [ "$StyleNum" != "" ]; then
      echo "$stylelist" | tr ',' '\n' | sed 's/^\ //g' | egrep -v '^$' | sort -u | sed -n "$StyleNum"p
   fi
}

function splitfontstr
{
   # Parse XFT font string
   RevFontName=$(echo "$XftFontStr" | awk -F: '{ print $2 }')
   RevFontStyle=$(echo "$XftFontStr" | awk -F: '{ print $4 }')
   RevFontSize=$(echo "$XftFontStr" | awk -F: '{ print $5 }' | sed 's/size=//g; s/"//g')

   # Fill working variable for getfontnumber
   SelectedFont=${RevFontName}

   # Call getfontnumber
   fontnumber=$(getfontnumber)
   if [ "x$fontnumber" != "x" ]; then
      echo $fontnumber
   else
      echo 0
   fi

   # Get style and style number and print it
   # If style is specified wrongly in the fontset, select first on the list
   StylesFmt="list"
   StylesOut=$(IFS=" " getfontstyles | grep -n '' | egrep "^[1-9]{1,}:${RevFontStyle}$" | cut -d":" -f1)
   if [ "x$StylesOut" != "x" ]; then
      echo $StylesOut
   else
      echo 1
   fi
   echo $RevFontSize

   echo $RevFontName
   echo $RevFontStyle
}

function matchfont
{
   type -p fc-match > /dev/null
   if (($? == 0)); then
      fc-match -f '%{+family,style{%{=unparse}}}\n' "$FontName" | while IFS=":" read matchname matchstyle
      do
         echo "$matchname"
         echo "${matchstyle##*style=}"
      done
   else
      # Handle absence of fc-match gracefully
      echo "$FontName"
      echo "Regular"
   fi
}

function genxresourcedefs
{
   echo '!'
   echo '! This file is a part of the NsCDE - Not so Common Desktop Environment'
   echo '! Author: Hegel3DReloaded'
   echo '! Licence: GPLv3'
   echo '!'

   if [ -n $XFT_USE_DPI ]; then
      echo "$XFT_USE_DPI" | egrep -q "^[[:digit:]]+$"
      if (($? == 0)); then
         echo -ne "\nXft.dpi: ${XFT_USE_DPI}\n\n"
      else
         echo -ne "\nXft.dpi: 96\n\n"
      fi
   else
      echo -ne "\nXft.dpi: 96\n\n"
   fi

   egrep '^InfoStoreAdd font\.(|variable|monospaced)\.(normal|bold|italic)\.(small|medium|large) ".*"' \
          "$FileIn" | awk '{ $1=""; print $0 }' | while IFS='"' read fvar xftstr
   do
      if [ "x$fvar" != "x" ]; then
         cppfvar=$(echo "$fvar" | sed 's/\./_/g' | tr '[a-z]' '[A-Z]' | sed 's/ $//g')
         cppfname=$(echo "$xftstr" | cut -d":" -f2)
         cppfstyle=$(echo "$xftstr" | cut -d":" -f4)
         cppfsize=$(echo "$xftstr" | cut -d":" -f5 | $NSCDE_TOOLSDIR/ised -c 's/size=\(.*\)/\1/g; s/\([[:digit:]]\+\)\.\([[:digit:]]\+\)/\1/g' -o -f -)
         echo "#define ${cppfvar}_NAME" "$cppfname"
         echo "#define ${cppfvar}_STYLE" "$cppfstyle"
         echo "#define ${cppfvar}_SIZE" "$cppfsize"
         echo ""
      fi
   done
}

function preparefontforgtk
{
   echo "$XftStr" | awk -F: '{ print $2, $4, $5 }' | sed 's/pixelsize=//g; s/size=//g'
}

function preparefontforqt5
{
   echo "$XftStr" | awk -F: '{ print "\""$2 "," $5"\"" }' | sed 's/pixelsize=//g; s/size=//g'
}

function miscintegrations
{
   # Dunst
   DunstFont=$(echo "$XftFontStr" | awk -F: '{ print $2, $4, $5 }' | sed 's/pixelsize=//g; s/size=//g')
   if [ -r "$FVWM_USERDIR/Dunst.conf" ]; then
      if [ -n $NewFont ]; then
         $NSCDE_TOOLSDIR/confset -t ini -c "$FVWM_USERDIR/Dunst.conf" -s global -k font -v "$DunstFont"
      fi
   fi
}


while getopts pPF:f:g:G:n:N:s:r:m:X:T:Q:M:h Option
do
   case $Option in
      p)
         menugen
      ;;
      P)
         fontsetsmenu
      ;;
      F)
         FontsetNum="$OPTARG"
         getfontsetname
      ;;
      f)
         FontsetFindName="$OPTARG"
         getfontsetnum
      ;;
      g)
         export SelectedFont="$OPTARG"
         getfontstyles
      ;;
      G)
         export StylesFmt="$OPTARG"
      ;;
      n)
         export SelectedFont="$OPTARG"
         getfontnumber
      ;;
      N)
         export FontNum="$OPTARG"
         getfontname
      ;;
      s)
         export StyleNum="$OPTARG"
      ;;
      r)
         XftFontStr="$OPTARG"
         splitfontstr
      ;;
      m)
         FontName="$OPTARG"
         matchfont
      ;;
      X)
         FileIn="$OPTARG"
         genxresourcedefs
      ;;
      T)
         XftStr="$OPTARG"
         preparefontforgtk
      ;;
      Q)
         XftStr="$OPTARG"
         preparefontforqt5
      ;;
      M)
         XftFontStr="$OPTARG"
         miscintegrations
      ;;
      h)
         echo "Usage: ..."
      ;;
   esac
done

