#!/usr/bin/env zsh
( cd ${(M)0##*/}./
typeset -A EXTS PATTS
EXTS=( jpeg "jpg jpe jpeg" pcx "pcx" gif "gif" tiff "tif tiff" png "png" xbm "xbm bitmap xbm.gz" xpm "xpm xpm.gz" )
PATTS=( 3d "3[dD]?*" mini "[Mm]ini[.-]*.*" )
FINDPATH="/usr/local /usr/share /usr/X11R6 /etc/X11"

# -u -- don't remove
# -r -- don't create
# -l -- don't move
# -v -- verbose
OPTSTR=":urlcv"
REMOVE=1 ;
LINK=1 ;
MOVE=1 ;
VERBOSE=0 ;
CLEAR=0 ;

while { getopts $OPTSTR PAR } {
  case $PAR { \?) echo "Usage: $0 -[${OPTSTR[2,-1]}]" ; exit ;;
               u) REMOVE=0 ;;
	       r) LINK=0 ;;
	       c) CLEAR=1 ;;
	       l) MOVE=0 ;;
	       v) VERBOSE=1; FINDVERB=-print ;; }
}

if (( $REMOVE )) { find . -type l -exec rm {} \; $FINDVERB }
if (( $CLEAR )) { rmdir * >& /dev/null; exit }
if (( $LINK )) {
  FINDFLAGS="( -name *.${=EXTS// / -o -name *.} )"
  find ${=FINDPATH} -type f ${=FINDFLAGS} -exec ln -s {} . \; $FINDVERB 
}
mkdir -p ${(k)=PATTS}
mkdir -p ${(k)=EXTS}
mkdir -p multy
for N in ${(k)=EXTS}
{ for P in ${(k)=PATTS} multy ; { ln -s ../$P $N } }
if (( $MOVE )) { 
# PATTS first then multy then EXTS
  for N in ${(k)=PATTS}
  {
    mv -f ${~=PATTS[$N]} $N
    if (( $VERBOSE )) echo ${=PATTS[$N]} " ==> " $N
  }
  FL=$( echo *<->*(@) )
  FLL=${FL//<->/<->}
  for N in $( echo "${FLL// /\\n}" | uniq )
  {
    if [[ $( echo $~N | wc -w ) -gt 2 ]] { mv $~N multy }
  }
  setopt NullGlob
  for N in ${(k)=EXTS}
  {
    L=" ${=EXTS[$N]}"
    mv -f ${~=L// / *.} $N
  }
  setopt NoNullGlob
}

#echo ${(k)EXTS}
#echo ${EXTS}
)
