#!/bin/bash

FLTMP=/tmp/flengths.log

format_percent () {
   FLPERCENT="0000$(( $1 * 10000 / $2 ))%"
   FLPERCENT="${FLPERCENT:0:$(( ${#FLPERCENT} - 3 ))}.${FLPERCENT:(-3)}"
   while [[ "${FLPERCENT:0:1}" == "0" ]]; do   
      FLPERCENT=${FLPERCENT:1}
   done
   [[ "${FLPERCENT:0:1}" == "." ]] && FLPERCENT="0$FLPERCENT"
}

FLCACHE=
FLGROUP=

while getopts cght: FLARGS 2>/dev/null; do
   case "$FLARGS" in
      c)
         FLCACHE=Y
         ;;
      g)
         FLGROUP=Y
         ;;
      h)
         echo "Usage: flengths [-c] [-g] [DIRECTORY]"
         exit
         ;;
      t)
         FLTMP=$OPTARG
         ;;
   esac
done
[[ "$OPTIND" ]] && shift $(($OPTIND - 1))

[[ -d "$1" ]] && FLSRC="$1" || FLSRC=`pwd`

FLTOTAL=0
if [[ ! "$FLCACHE" ]]; then
   [[ -f "$FLTMP" ]] && rm "$FLTMP"
   echo "Scanning $FLSRC..."
   while read FLFILE; do
      FLLENGTH=`exiftool -EXIF:FocalLength -Composite:Lens "$FLFILE" 2>/dev/null`
      FLLENS=${FLLENGTH#*$'\n'}
      FLLENGTH=${FLLENGTH%$'\n'*}
      if [[ "$FLLENGTH" ]]; then
         FLTOTAL=$(( $FLTOTAL + 1 ))
         echo "${FLLENGTH##*: } ${FLLENS##*: }" >> $FLTMP
      fi
   done < <(
      find -E "$FLSRC" -type f -iregex ".*\.(crw|cr2)$" -print
   )
else
   [[ -f "$FLTMP" ]] && FLTOTAL=`grep -c . $FLTMP`
fi

if [[ "$FLTOTAL" == "0" ]]; then
   echo "No files found."
   exit
fi

echo "Collating $FLTOTAL files..."
FLLENSPERCENT=
[[ "$FLGROUP" ]] && FLSUFFIX=" of total"
FLLENGTHCOUNT=-1
FLLENSTOTAL=0
FLLENSCOUNT=0
while read FLLENGTH FLLENS; do
   FLLENGTH="        $FLLENGTH"
   FLLENGTH=${FLLENGTH:(-8)}
   FLLENGTHCOUNT=$(( $FLLENGTHCOUNT + 1 ))
   FLLENSCOUNT=$(( $FLLENSCOUNT + 1 ))
   if [[ "$FLLENGTHCOUNT" == "0" ]]; then
      FLLENSLAST=$FLLENS
      FLLENGTHLAST=$FLLENGTH
      FLLENGTHCOUNT=0
      FLLENSCOUNT=0
      if [[ "$FLGROUP" ]]; then
         FLLENSTOTAL=`grep -c " $FLLENSLAST$" $FLTMP`
         format_percent $FLLENSTOTAL $FLTOTAL
         echo "=================================================="
         echo "LENS '$FLLENSLAST' : $FLLENSTOTAL ($FLPERCENT)"
         echo "--------------------------------------------------"
      fi
   elif [[ "$FLLENGTHLAST" != "$FLLENGTH" ]]; then
      if [[ $FLGROUP ]]; then
         format_percent $FLLENGTHCOUNT $FLLENSTOTAL
         FLPERCENT="  $FLPERCENT"
         FLLENSPERCENT="${FLPERCENT:(-7)}) ("
      fi
      format_percent $FLLENGTHCOUNT $FLTOTAL
      FLPERCENT="  $FLPERCENT"
      FLLENGTHCOUNT="     $FLLENGTHCOUNT"
      echo "$FLLENGTHLAST : ${FLLENGTHCOUNT:(-6)} ($FLLENSPERCENT${FLPERCENT:(-7)}$FLSUFFIX)"
      if [[ "$FLGROUP" ]] && [[ "$FLLENSLAST" != "$FLLENS" ]]; then
         FLLENSLAST=$FLLENS
         FLLENSTOTAL=`grep -c " $FLLENSLAST$" $FLTMP`
         FLLENSCOUNT=0
         format_percent $FLLENSTOTAL $FLTOTAL
         echo "=================================================="
         echo "LENS '$FLLENSLAST' : $FLLENSTOTAL ($FLPERCENT of total)"
         echo "--------------------------------------------------"
      fi
      FLLENGTHLAST=$FLLENGTH
      FLLENGTHCOUNT=0
   fi
done < <(
   [[ "$FLGROUP" ]] && sort -k 2n -k 4n -k 1n "$FLTMP" || sort -n "$FLTMP"
)
FLLENGTHCOUNT=$(( $FLLENGTHCOUNT + 1 ))
FLLENSCOUNT=$(( $FLLENSCOUNT + 1 ))
if [[ $FLGROUP ]]; then
   format_percent $FLLENGTHCOUNT $FLLENSTOTAL
   FLPERCENT="  $FLPERCENT"
   FLLENSPERCENT="${FLPERCENT:(-7)}) ("
fi
format_percent $FLLENGTHCOUNT $FLTOTAL
FLPERCENT="  $FLPERCENT"
FLLENGTHCOUNT="     $FLLENGTHCOUNT"
echo "$FLLENGTHLAST : ${FLLENGTHCOUNT:(-6)} ($FLLENSPERCENT${FLPERCENT:(-7)}$FLSUFFIX)"
