#!/bin/bash
# Skrypt valid-date sprawdza poprawność daty z uwzględnieniem lat przestępnych.

PATH=.:$PATH

exceedsDaysInMonth()
{
  # Ta funkcja zwraca 0, jeżeli podany w argumencie numer dnia miesiąca
  # jest mniejszy lub równy liczbie dni w danym miesiącu.
  # W przeciwnym wypadku funkcja zwraca 1.
  case $(echo $2|tr '[:upper:]' '[:lower:]') in
    sty* ) days=31    ;;  lut* ) days=28    ;;
    mar* ) days=31    ;;  kwi* ) days=30    ;;
    maj* ) days=31    ;;  cze* ) days=30    ;;
    lip* ) days=31    ;;  sie* ) days=31    ;;
    wrz* ) days=30    ;;  paź* ) days=31    ;;
    lis* ) days=30    ;;  gru* ) days=31    ;;
    * ) echo "$0: Błędna nazwa miesiąca $2." >&2; exit 1
  esac
   if [ $1 -lt 1 -o $1 -gt $days ] ; then
     return 1
   else
     return 0   # Numer dnia jest poprawny.
   fi 
}

isLeapYear()
{
  # Ta funkcja zwraca 0, jeżeli dany rok jest rokiem przestępnym.
  # W przeciwnym wypadku funkcja 1.
  # Zasady sprawdzania, czy rok jest przestępny, są następujące:
  # 1. rok niepodzielny przez 4 nie jest przestępny
  # 2. rok podzielny przez 4 i 400 jest przestępny
  # 3. rok podzielny przez 4, niepodzielny przez 400
  #    i podzielny przez 100 jest przestępny
  # 4. każdy inny rok podzielny przez 4 jest przestępny
  year=$1
  if [ "$((year % 4))" -ne 0 ] ; then
    return 1 # rok nieprzestępny
  elif [ "$((year % 400))" -eq 0 ] ; then
    return 0 # rok przestępny
  elif [ "$((year % 100))" -eq 0 ] ; then
    return 1
  else
     return 0
  fi
}

# POCZĄTEK GŁÓWNEJ CZĘŚCI SKRYPTU. USUŃ LUB ZAMIEŃ W KOMENTARZ KOD PONIŻEJ TEGO WIERSZA,
# JEŻELI TEN SKRYPT BĘDZIE WYKORZYSTYWANY W INNYCH SKRYPTACH.
# =================

#if [ $# -ne 3 ] ; then
#  echo "Użycie: $0 dzień miesiąc rok" >&2
#  echo "Typowe formaty: '3 sierpnia 2002', '3 8 2002'." >&2
#  exit 1
#fi

# Normalizacja daty i zapisanie wyniku w celu jego dalszego sprawdzenia.
#newdate="$(normdate "$@")"
#if [ $? -eq 1 ] ; then
#  exit 1        # Błąd zgłoszony przez skrypt normdate.
#fi

# Podzielenie znormalizowanej daty. Pierwsza część zawiera numer dnia,
# druga nazwę miesiąca, trzecia numer roku.

#day="$(echo $newdate | cut -d\  -f1)"
#month="$(echo $newdate | cut -d\  -f2)"
#year="$(echo $newdate | cut -d\  -f3)"

# Po znormalizowaniu daty sprawdzamy, czy numer dnia jest poprawny
# (np. nie jest to 36 stycznia).
#if ! exceedsDaysInMonth "$1" $month ; then
#  if [ "$month" = "lut" -a "$1" -eq "29" ] ; then
#    if ! isLeapYear $3 ; then
#      echo "$0: $3 nie jest rokiem przestępnym, więc luty nie ma 29 dni." >&2
#      exit 1
#    fi
#  else
#    echo "$0: błędny numer dnia: $month nie ma $1 dni." >&2
#    exit 1
#  fi
#fi

#echo "Data $newdate jest poprawna."

#exit 0
