#!/bin/sh
# timein - donne l'heure du fuseau horaire ou de la zone gographique
#   indique. Sans arguments, donne UTC/GMT. Donnez l'argument list
#   pour voir la liste de toutes les rgions gographiques connues. Il
#   est possible de reconnatre des rpertoires de zones (ou rgions),
#   mais seuls les fichiers de fuseaux horaires (ou villes) sont des
#   spcifications valides. 

#   Rfrence pour la base de donnes des fuseaux horaires:
#   http://www.twinsun.com/tz/tz-link.htm

zonedir="/usr/share/zoneinfo"

if [ ! -d $zonedir ] ; then 
  echo "Pas de base de donnes de fuseaux horaires en $zonedir." >&2 ; exit 1 
fi

if [ -d "$zonedir/posix" ] ; then 
  zonedir=$zonedir/posix        # systmes Linux modernes
fi

if [ $# -eq 0 ] ; then 
  timezone="UTC" 
  mixedzone="UTC"
elif [ "$1" = "list" ] ; then
  ( echo "Voici tous les fuseaux et rgions horaires dfinis sur ce systme:"
  cd $zonedir
  find * -type f -print | xargs -n 2 | \
    awk '{ printf "  %-38s %-38s\n", $1, $2 }'
  ) | more
  exit 0
else

  region="$(dirname $1)"
  zone="$(basename $1)"

  # Est-ce une correspondance exacte? Si oui, on y va. Dans le cas
  # contraire, il nous faut creuser un peu pour trouver les choses. On
  # commence par compter les correspondances.

  matchcnt="$(find $zonedir -name $zone -type f -print | \
    wc -l | sed 's/[^[:digit:]]//g' )"

  if [ "$matchcnt" -gt 0 ] ; then       # au moins un fichier correspond
    if [ $matchcnt -gt 1 ] ; then       # plus d'un fichier correspond
      echo "$zone correspond  plusieurs enregistrements de fuseaux horaires." >&2
      echo "Veuillez utiliser list pour voir toutes les rgions et fuseaux connus." >&2
      exit 1
    fi
    match="$(find $zonedir -name $zone -type f -print)"
    mixedzone="$zone"
  else
    # La premire lettre est majuscule, le reste du mot est en
    # minuscules pour la rgion et la zone
    mixedregion="$(echo ${region%${region#?}} | tr '[[:lower:]]' '[[:upper:]]')\
$(echo ${region#?} | tr '[[:upper:]]' '[[:lower:]]')"  
    mixedzone="$(echo ${zone%${zone#?}} | tr '[[:lower:]]' '[[:upper:]]')\
$(echo ${zone#?} | tr '[[:upper:]]' '[[:lower:]]')"

    if [ "$mixedregion" != "." ] ; then
      # On n'examine que la zone spcifie dans la rgion indique
      # pour que les utilisateurs puissent prciser des correspondances
      # uniques quand il y a plusieurs possibilits 
      # (ex. Atlantic) 
      match="$(find $zonedir/$mixedregion -type f -name $mixedzone -print)"
    else
      match="$(find $zonedir -name $mixedzone -type f -print)"
    fi

    if [ -z "$match"  ] ; then    # aucun fichier ne correspond au motif
      if [ ! -z $(find $zonedir -name $mixedzone -type d -print) ] ; then 
        echo \
         "La rgion $1 compte plusieurs fuseaux horaires. Veuillez utiliser list" >&2 
      else  #  ce n'est en rien une correspondance
       echo "Je ne peux trouver une correspondance exacte pour $1. Veuillez utiliser list" >&2 
      fi 
      echo "pour voir la liste de toutes les rgions et de tous les fuseaux horaires." >&2 
      exit 1
    fi
  fi
  timezone="$match"
fi

nicetz=$(echo $timezone | sed "s|$zonedir/||g")   # enjolive un peu la sortie 

echo C\'est le $(TZ=$timezone date '+%A, %B %e, %Y, et il est %l:%M %p')  $nicetz

exit 0
