#!/bin/bash
if [[ "$1" == --help || "$1" == -h ]] ; then
  echo "USAGE: ${0##*/} [-h|--help] [-v] [--lib] [--cleanup|--restore] [maxdirsize] \$PATH|\$LD_LIBRARY_PATH|\$LIBPATH (arguments are order dependent)" 1>&2
  echo "       version = 1.0.1 2015/04/16"  1>&2
  exit 0
fi
Where=$(true_path ${0})
Where=${Where%/*}
${Where%/*}/bin/make_link_files_in_dir
which link_files_in_dir 2>/dev/null 1>/dev/null || exit 1  # could not make the needed program
Verbose="0"
[[ "$1" == "-v" ]]   && Verbose="1" && shift 1>&2
[[ "$1" == "-vv" ]]  && Verbose="2" && shift 1>&2
[[ "$1" == "-vvv" ]] && Verbose="3" && shift 1>&2

LibMode=""
[[ "$1" == "--lib" ]] && LibMode="--lib" && shift   # LD_LIBRARY_PATH/LIBPATH rather than PATH

rm -rf $TMPDIR/.path_cache${LibMode}_1*   # cleanup before processing
((Verbose>0)) && echo "INFO: removing fast path directories $TMPDIR/.path_cache${LibMode}_1*"  1>&2
[[ "$1" == "--cleanup" ]] && rm -f $TMPDIR/.path_cache${LibMode}* && exit 0

[[ -f $TMPDIR/.path_cache${LibMode} ]] && . $TMPDIR/.path_cache${LibMode}

[[ "$1" == "--restore" ]] && shift && echo "${OldPathValue:-${*}}" && exit 0
#
Number=""
if [[ "$1" == [1-9]* ]] ; then
  Number=$1
  shift
fi
NewDir=1
BaseDir=100
NewPath=""
[[ -z ${LibMode} ]] && NewPath="${TMPDIR}/bin"
#
for Target in $(echo $* | tr ':' '\n') 
do
  [[ ${Target} == ${TMPDIR}/bin ]] && continue   # red herring in library mode
  ((Verbose>2)) && echo "INFO: processing '${Target}'" 1>&2
#
  if [[ ${Target} == /usr/* || ${Target} == /bin || ${Target} == /sbin || ${Target} == /opt* || ${Target} == /lib* ]] ; then
    ((status=3))                            # status 3 if directory does not exist
    [[ -d ${Target} ]] && status=2          # /usr/... and it exists,  do no bother optimizing
    ((Verbose>2)) && echo "INFO: ignoring '${Target}'" 1>&2
  else
    ${TMPDIR}/bin/link_files_in_dir ${LibMode} ${Number} ${Target}
    status=$?  # status=2 if too many entries to be worth linking, status=2 if directory does not exist
  fi
  ((status==3)) && continue                 # cannot open directory, ignore it
#
  if [[ ${Target} != /* ]] ; then           # non absolute path, keep as is
    [[ -d ${Target} ]] && NewPath="${NewPath}:${Target}"
    continue
  fi
#
  ((Verbose>1)) && echo "${status} ${Target}"   1>&2
  case ${status} in
    0) # reasonable number of entries in directory, use soft links
       ((NewDir==1)) && \
       mkdir -p $TMPDIR/.path_cache${LibMode}_${BaseDir} && \
       NewPath="${NewPath}:$TMPDIR/.path_cache${LibMode}_${BaseDir}"
       ${TMPDIR}/bin/link_files_in_dir ${LibMode} ${Number} ${Target} $TMPDIR/.path_cache${LibMode}_${BaseDir}
       ((NewDir==0)) && printf ":%s" ${Target} >> $TMPDIR/.path_cache${LibMode}_${BaseDir}.src
       ((NewDir==1)) && printf "%s" ${Target} >> $TMPDIR/.path_cache${LibMode}_${BaseDir}.src
       ((NewDir=0))
       ;;
    2) # too many entries in directory, link to the directory instead
       ((NewDir==0)) && ((BaseDir=BaseDir+1))
       ((NewDir=1))
       NewPath="${NewPath}:${Target}"
#       ln -s ${Target} $TMPDIR/.path_cache_${BaseDir}
#       NewPath="${NewPath}:$TMPDIR/.path_cache_${BaseDir}"
#       printf "%s" ${Target} >> $TMPDIR/.path_cache_${BaseDir}.src
#       ((BaseDir=BaseDir+1))
       ;;
    *) # other error while trying to link
       echo Status = ${status} 1>&2
       exit ${status}
       ;;
  esac
done
NewPath="${NewPath#:}"
((Verbose>0)) && echo "INFO: optimized path will be"   1>&2
((Verbose>0)) && echo "${NewPath}" | tr ':' '\n' 1>&2
echo "OldPathValue=${*}"    >$TMPDIR/.path_cache${LibMode}
echo "NewPathValue=${NewPath}" >>$TMPDIR/.path_cache${LibMode}
echo "${NewPath}"
