#!/bin/sh

# This script takes an input directory and processes all files.
# It creates a directory structure in the output directory based
# on metadata of the file. The filename will also be created out
# of metadata, or replaced with the sha1 hash of itself in order
# to avoid duplicates.

usage() {
  print "Usage: autosort <input directory> <output directory>";
  exit 2
}

# check input
test -d "$1" || usage
test -d "$2" || usage

# normalize relative paths
_indir="$(readlink -f "$1")"
_outdir="$(readlink -f "$2")"

####################
#   MAIN PROGRAM   #
####################

start(){
  # trigger main loop
  find "$_indir" -type f | while read _file;
  do
    # extract mime type
    local _mime="$(file -bi "$_file")"
    local _category=${_mime%%/*}
    local _type=${_mime##*/}

    case "$_category" in
      image) process_image "$_file" "$_type"; ;;
      *) printf 'Unhandled Category: %s in %s\n' "$_category" "$_file"; ;;
    esac

  done
}

#################
#   FUNCTIONS   #
#################

process_image() {
# $1 = file
# $2 = mime type
  case $2 in
    jpeg) handle_jpeg "$1"; ;;
    png) handle_jpeg "$1"; ;;
    gif) handle_copy "$1" "image" "$2"; ;;
    *) printf 'Unhandled Type: %s in %s\n' "$2" "$1"; ;;
  esac
}

handle_jpeg() {
# $1 = file
  local _exif="$(exifprint "$1")"
  local _make="$(printf '%s' "$_exif" | grep '0x010f' | awk '{for(i=5;i<=NF;++i)print $i}')"
  local _model="$(printf '%s' "$_exif" | grep '0x0110' | awk '{for(i=5;i<=NF;++i)print $i}')"
  local _datetime="$(printf '%s' "$_exif" | grep '0x9003' | awk '{for(i=5;i<=NF;++i)print $i}')"

  test -z "$_make" && local _make=unknown
  test -z "$_model" && local _model=unknown
  test -z "$_datetime" && local _datetime="$(sha1 -q "$1")"

  local _out="$(printf '%s %s/%s' "$_make" "$_model" "$_datetime" | tr '\n' ' ' | tr ':' '-')"

  install -bDm 0666 "$1" "$_outdir/${_out}.jpg" && rm -f "$1"
}

handle_copy() {
# $1 = file
# $2 = category
# $3 = type
  install -bDm 0666 "$1" "$_outdir/$2/$3/${1##*/}" && rm -f "$1"
}

start
