#!/bin/bash
INFILE="$1"
PATH=/usr/local/bin/:$PATH
XMLLINT=xmllint
XMLERROR=/tmp/xmlerror$$

find /tmp -iname 'xmlerror*' -mtime 1 -exec rm {} \;

function getPath()
{
    echo `cat "$INFILE" | head -"$(($1-1))" | awk '
BEGIN \
{
  idx=0;
}

function gettag(line) \
{
  return gensub(".*</?([^ />]+).*", "\\\\1", "1", line)
}

/<\\?/ { next }
/\/>/  { next }

/<NumeroLinea>/ { numeroLinea=gensub(".*>(.*)<.*","\\\\1", "1") }

/<[^\/]/ \
{
  path[idx]=gettag($0)
  idx++
}

/<\// { idx-- }

END \
{
  for (x = 1; x < idx; x++)
  {
    tag=path[x]
    if (tag=="DettaglioLinee") tag=tag"("numeroLinea")"
    printf("%s/", tag)
  }
}
'`

}

if [ ! -f "$INFILE" ]
then
  echo input file non trovato
  exit 2
fi
SCHEMAFILE=`dirname $0`/`cat $INFILE | grep 'xsi:schemaLocation=' | sed 's/.*\/\([^/]*\.xsd\).*/\1/'`
if [ ! -f "$SCHEMAFILE" ]
then
  echo schema file $SCHEMAFILE non trovato
  exit 2
fi
#LD_PRELOAD=/tmp/libxml2.so.2.7.1  /usr/local/bin/xmllint --schema $SCHEMAFILE --noout "$INFILE" 2>$XMLERROR && rm -f $XMLERROR && exit 0
$XMLLINT --schema $SCHEMAFILE --noout "$INFILE" 2>$XMLERROR && rm -f $XMLERROR && exit 0

if cat $XMLERROR | grep -q 'parser error : Input is not proper UTF-8'
then
  echo "Carattere non valido"
  cat $XMLERROR | egrep '<.*>.*</.*>' | sed 's#</.*>##; s/<//; s/>/: /'
  rm -f $XMLERROR
  exit 1
fi

# /tmp/fe_fat.xml:4: element DatiTrasmissione: Schemas validity error : Element 'DatiTrasmissione': Missing child element(s). Expected is ( FormatoTrasmissione ).
# /tmp/fe_fat.xml:26: element CAP: Schemas validity error : Element 'CAP': '100901' is not a valid value of the atomic type '{http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2}CAPType'.
# ubuntu18 fa solo questa riga, pero' la fanno anche ubuntu precedenti:
# /tmp/fe_fat.xml:48: element CAP: Schemas validity error : Element 'CAP': [facet 'pattern'] The value '570251' is not accepted by the pattern '[0-9][0-9][0-9][0-9][0-9]'.

cat "$XMLERROR" | egrep 'is not accepted by the pattern|Missing child element|This element is not expected' |
while read LINE; do
  LINENR=`echo "$LINE" | cut -d':' -f2`
  ELEMENT=`echo "$LINE" | sed "s/.*Element '//; s/'.*//"`
  if echo "$LINE" | grep -q 'Missing child element'
  then
    VALUE='manca '`echo "$LINE" | sed "s/.*Expected is ( //; s/ ).*//"`
  elif echo "$LINE" | grep -q 'This element is not expected'
  then
    VALUE='elemento inaspettato ( previsto '`echo "$LINE" | sed "s/.*(//"`
  elif echo "$LINE" | grep -q 'is not accepted by the pattern'
  then
    VALUE='valore '`echo "$LINE" | sed "s/.*Element '[^']*': .* The value '//; s/'.*//"`' non valido'
  fi
#  else
#    VALUE='valore '`echo "$LINE" | sed "s/.*Element '[^']*': '//; s/'.*//"`' non valido'
#  fi
  ELEMENT_PATH=`getPath $LINENR`
#  echo "line $LINENR element path= $ELEMENT_PATH$ELEMENT" bad value $VALUE 
  echo -e "$ELEMENT_PATH$ELEMENT:\n $VALUE"
done


rm -f $XMLERROR
exit 1
