#!/bin/sh

set -eu

uso() {
  echo "Uso:"
  echo "  $0 check FAMIGLIA CORSO PREFISSO"
  echo "  $0 check FAMIGLIA CORSO PREFISSO PREFISSO_EXTRA CARTELLA_EXTRA"
  echo "  $0 run   FAMIGLIA CORSO PREFISSO"
  echo "  $0 run   FAMIGLIA CORSO PREFISSO PREFISSO_EXTRA CARTELLA_EXTRA"
  echo
  echo "Esempi:"
  echo "  $0 check AM1 AM10 AM10_L"
  echo "  $0 check AM1 AM09 AM09_L AM09_R Ricevimento"
  exit 1
}

[ "$#" -eq 4 ] || [ "$#" -eq 6 ] || uso

modo="$1"
famiglia="$2"
corso="$3"
prefisso="$4"

prefisso_extra=""
cartella_extra=""

if [ "$#" -eq 6 ]; then
  prefisso_extra="$5"
  cartella_extra="$6"
fi

case "$modo" in
  check|run) ;;
  *) uso ;;
esac

sorgente="Tablet/$corso"
destinazione="ArchivioDidattico/$famiglia/$corso"

echo "Modalità:      $modo"
echo "Sorgente:      $sorgente"
echo "Destinazione:  $destinazione"
echo "Prefisso:      $prefisso"

if [ -n "$prefisso_extra" ]; then
  echo "Extra:         $prefisso_extra -> $cartella_extra"
fi

if [ -L "$sorgente" ]; then
  echo "ERRORE: $sorgente è già un link simbolico."
  exit 1
fi

if [ ! -d "$sorgente" ]; then
  echo "ERRORE: $sorgente non esiste o non è una directory."
  exit 1
fi

if [ -e "$destinazione" ]; then
  echo "ERRORE: $destinazione esiste già."
  exit 1
fi

anomali=0

echo
echo "Controllo dei file presenti..."

for file in "$sorgente"/*
do
  [ -e "$file" ] || continue
  if [ -d "$file" ]; then
    echo "IGNORATA: sottodirectory $file"
    continue
  fi

  [ -f "$file" ] || {
    echo "ANOMALIA: elemento non riconosciuto: $file"
    anomali=1
    continue
  }

  nome=$(basename "$file")

  case "$nome" in
    "$prefisso"*.pdf|"$prefisso"*.avi)
      ;;
    *)
      if [ -n "$prefisso_extra" ]; then
        case "$nome" in
          "$prefisso_extra"*.pdf|"$prefisso_extra"*.avi)
            ;;
          *)
            echo "ANOMALIA: file non riconosciuto: $file"
            anomali=1
            ;;
        esac
      else
        echo "ANOMALIA: file non riconosciuto: $file"
        anomali=1
      fi
      ;;
  esac
done

if [ "$anomali" -ne 0 ]; then
  echo
  echo "Controllo fallito: non è stato modificato nulla."
  exit 1
fi

echo "Controllo superato."

if [ "$modo" = "check" ]; then
  echo "Modalità check: non è stato modificato nulla."
  exit 0
fi

echo
echo "Inizio migrazione..."

mkdir -p "ArchivioDidattico/$famiglia"
mv "$sorgente" "$destinazione"

mkdir -p \
  "$destinazione/Pdf" \
  "$destinazione/Avi" \
  "$destinazione/Documenti"

if [ -n "$prefisso_extra" ]; then
  mkdir -p \
    "$destinazione/$cartella_extra/Pdf" \
    "$destinazione/$cartella_extra/Avi"
fi

for file in "$destinazione"/*
do
  [ -f "$file" ] || continue

  nome=$(basename "$file")

  case "$nome" in
    "$prefisso"*.pdf)
      mv "$file" "$destinazione/Pdf/"
      ;;
    "$prefisso"*.avi)
      mv "$file" "$destinazione/Avi/"
      ;;
    *)
      if [ -n "$prefisso_extra" ]; then
        case "$nome" in
          "$prefisso_extra"*.pdf)
            mv "$file" "$destinazione/$cartella_extra/Pdf/"
            ;;
          "$prefisso_extra"*.avi)
            mv "$file" "$destinazione/$cartella_extra/Avi/"
            ;;
        esac
      fi
      ;;
  esac
done

for file in "$destinazione"/Pdf/*
do
  [ -f "$file" ] || continue
  nome=$(basename "$file")
  ln -s "Pdf/$nome" "$destinazione/$nome"
done

for file in "$destinazione"/Avi/*
do
  [ -f "$file" ] || continue
  nome=$(basename "$file")
  ln -s "Avi/$nome" "$destinazione/$nome"
done

if [ -n "$prefisso_extra" ]; then
  for file in "$destinazione/$cartella_extra/Pdf"/*
  do
    [ -f "$file" ] || continue
    nome=$(basename "$file")
    ln -s "$cartella_extra/Pdf/$nome" "$destinazione/$nome"
  done

  for file in "$destinazione/$cartella_extra/Avi"/*
  do
    [ -f "$file" ] || continue
    nome=$(basename "$file")
    ln -s "$cartella_extra/Avi/$nome" "$destinazione/$nome"
  done
fi

ln -s "../ArchivioDidattico/$famiglia/$corso" "$sorgente"

echo
echo "Migrazione completata: $corso"
echo "Controllo dei link simbolici..."

if find "$destinazione" "$sorgente" \
  -type l ! -exec test -e {} \; -print | grep .
then
  echo "ERRORE: sono presenti link simbolici non validi."
  exit 1
fi

echo "Tutti i link simbolici risultano validi."
