#!/bin/sh

# SUPPORTED: ASTYLE COMMENT_STYLE OVERRIDE_CORRECTNESS
# ASTYLE                    <- runs AStyle
# COMMENT_STYLE             <- converts //bla to // bla (note, // Bla might be better, but this would conflict with code (at least)
# Use at own Risk:
# OVERRIDE_CORRECTNESS[2]   <- Appends override correctness (add 2 for second pass)

# Do config stuff
sh "${0%/*}/cleanupToolConfig.sh"
if [ "$?" != "0" ]
then
  echo "You need to edit the configuration file before you can use this tool!"
  echo "Configuration file: ${0%/*}/cleanupTools.config"
  exit 0
fi

# And use config settings
. "${0%/*}/cleanupTools.config"


## Internal Stuff

# Mangos Cleanup options for AStyle
OPTIONS="--convert-tabs --align-pointer=type --suffix=none \
          --keep-one-line-blocks --keep-one-line-statements \
          --indent-classes --indent-switches --indent-namespaces \
          --pad-header --unpad-paren --pad-oper --style=allman"

if [ "$DO_ON" = "MANGOS_SRC" ]
then
  FILEPATH=$BASEPATH/src
  OPTIONS="$OPTIONS --exclude=ScriptDev2"
elif [ "$DO_ON" = "MANGOS_CONTRIB" ]
then
  FILEPATH=$BASEPATH/contrib
elif [ "$DO_ON" = "MANGOS_WHOLE" ]
then
  FILEPATH=$BASEPATH
  OPTIONS="$OPTIONS --exclude=ScriptDev2"
elif [ "$DO_ON" = "SD2" ]
then
  FILEPATH=$BASEPATH/src/bindings/ScriptDev2
else
  exit 1
fi

OPTIONS="$OPTIONS --recursive"

####################################################################################################
##                              USING ASTYLE UPDATING                                             ##
####################################################################################################
if [ $DO = ASTYLE ]
then
  echo "Process $FILEPATH with options $MOPTIONS"
  $ASTYLE $OPTIONS "$FILEPATH/*.cpp" "$FILEPATH/*.h"

  #Restore style of auto-generated sql-files
  if [ "$DO_ON" = "MANGOS_SRC" -o "$DO_ON" = "MANGOS_WHOLE" ]
  then
      if [ -f "$BASEPATH/src/shared/revision_nr.h" ]
      then
        sed 's/^#define REVISION_NR/ #define REVISION_NR/g' < ${BASEPATH}/src/shared/revision_nr.h > temp
        mv temp "$BASEPATH/src/shared/revision_nr.h"
      fi
      if [ -f "$BASEPATH/src/shared/revision_sql.h" ]
      then
        sed 's/^#define REVISION_DB/ #define REVISION_DB/g' < ${BASEPATH}/src/shared/revision_sql.h > temp
        mv temp "$BASEPATH/src/shared/revision_sql.h"
      fi
  elif [ "$DO_ON" = "SD2" ]
  then
    if [ -f "$BASEPATH/src/bindings/ScriptDev2/sd2_revision_nr.h" ]
      then
        sed 's/^#define SD2_REVISION_NR/ #define SD2_REVISION_NR/g' < ${BASEPATH}/src/bindings/ScriptDev2/sd2_revision_nr.h > temp
        mv temp "$BASEPATH/src/bindings/ScriptDev2/sd2_revision_nr.h"
      fi
  fi

  echo "Processing $DO on $DO_ON done"
  exit 0
fi


####################################################################################################
##                                     UNIFYING COMMENTS                                          ##
####################################################################################################
## Make comments neater //bla => // bla ## note for uppercase  s:\// \([a-z]\):// \1:g
if [ $DO = COMMENT_STYLE ]
then
  if [ "$DO_ON" = "MANGOS_SRC" ]
  then
    LIST=`find ${BASEPATH}/src/ -path "${BASEPATH}/src/bindings/ScriptDev2" -prune -o -type f -iname "*.cpp" -print -o -iname "*.h" -print `
  elif [ "$DO_ON" = "SD2" ]
  then
    LIST=`find ${BASEPATH}/src/bindings/ScriptDev2 -type f -iname "*.cpp" -o -iname "*.h" `
  else
    echo "Unsupported combination with DO and DO_ON"
    exit 1
  fi

  for l in $LIST
  do
    echo "Converting comments in $l"
    sed '/http:/ !s:\//\([a-zA-Z0-9]\):// \1:g;
         s#^\(............................................................\) [ ]*//#\1//#g;
         /^..............................................\/[\/]*$/ !s#^\(..................................................\)//#\1          //#g; ' "$l" > temp
    if [ "$?" != "0" ]
    then
      echo "An error HAPPENED"
      exit 1
    fi

    mv temp "$l"
  done

  echo "Processing $DO on $DO_ON done"
  exit 0
fi

####################################################################################################
##                                    OVERRIDE CORRECTNESS                                        ##
####################################################################################################
# use OVERRIDE_CORRECTNESS  to create helper file listing all virtual methods
# use OVERRIDE_CORRECTNESS2 to add the word "override" after all functions with virtual names

if [ "$DO_ON" != "MANGOS_SRC" -a "$DO_ON" != "SD2" ]
then
  echo "OVERRIDE atm only supported for MANGOS_SRC or SD2 target"
  exit 0
fi

if [ $DO = OVERRIDE_CORRECTNESS ]
then
  #Create a list of all virtual functions in mangos (class scope)
  if [ $DO_ON = MANGOS_SRC ]
  then
    HEADERLIST=`find ${BASEPATH}/src/ -path "${BASEPATH}/src/bindings/ScriptDev2" -prune -o -type f -iname "*.h" -print`
  else
    HEADERLIST=`find ${BASEPATH}/src/bindings/ScriptDev2 -type f -iname "*.h"`
    HEADERLIST="${HEADERLIST} ${BASEPATH}/src/game/CreatureAI.h"
    HEADERLIST="${HEADERLIST} ${BASEPATH}/src/game/InstanceData.h"
  fi

  rm virtuals
  for h in $HEADERLIST
  do
    grep "virtual" "$h" >> virtuals
  done

  #Filter comment lines
  sed -n '/^[ ]*\/\// !p' virtuals | sed -n '/^[ ]*\/\*/ !p' | \
  ##Get function name
  sed -r -n '/^[ ]*virtual[ ][ ]*const[\*]*[ ][ ]*[a-zA-Z_~0-9\*:&]*[ ][ ]*const[\*]*[ ][]*[a-zA-Z_~0-9]*[ ]*\(.*\)/ { s/^[ ]*virtual[ ]*const[ ]*[a-zA-Z_~0-9\*:]*[ ]*const[ ]*([a-zA-Z_~0-9]*).*/\1/g; tEnde}
       /^[ ]*virtual[ ][ ]*const[\*]*[ ][ ]*[a-zA-Z_~0-9\*:&]*[ ][ ]*[a-zA-Z_~0-9]*[ ]*\(.*\)/                       { s/^[ ]*virtual[ ]*const[ ]*[a-zA-Z_~0-9\*:]*[ ]*([a-zA-Z_~0-9]*).*/\1/g;          tEnde}
       /^[ ]*virtual[ ][ ]*[a-zA-Z_~0-9\*:&]*[ ][ ]*const[\*]*[ ][ ]*[a-zA-Z_~0-9]*[ ]*\(.*\)/                       { s/^[ ]*virtual[ ]*[a-zA-Z_~0-9\*:]*[ ]*const[\*]*[ ]*([a-zA-Z_~0-9]*).*/\1/g;          tEnde}
       /^[ ]*virtual[ ]*[a-zA-Z_~0-9\*:&]*[ ][ ]*[a-zA-Z_~0-9]*[ ]*\(.*\)/                                           { s/^[ ]*virtual[ ]*[a-zA-Z_~0-9\*:]*[ ][ ]*([a-zA-Z_~0-9]*).*/\1/g;}
       :Ende; p' > virtualNames

  ##Make its entries unique
  sort < virtualNames > virtuals
  uniq  < virtuals > virtualNames

  echo "Check file virtualNames for inconsitencies!"
  rm virtuals

  echo "Processing $DO on $DO_ON done"
  exit 0
fi

if [ $DO = OVERRIDE_CORRECTNESS2 ]
then
  ## Assume virtualNames is good
  if [ $DO_ON = MANGOS_SRC ]
  then
    FILELIST=`find ${BASEPATH}/src/ -path "${BASEPATH}/src/bindings/ScriptDev2" -prune -o -type f -iname "*.h" -print`
  else
    FILELIST=`find ${BASEPATH}/src/bindings/ScriptDev2 -type f -iname "*.cpp" -o -iname "*.h"`
  fi

  for h in $FILELIST
  do
    echo "Progress file $h"
    while read f
    do
      # basic pattern: NAME(..)...[;]
      PARSE="s/( "$f"\(.*\)[ ]*const[\*]*);/\1 override;/g; t
             s/( "$f"\(.*\));/\1 override;/g; t
             s/( "$f"\(.*\)[ ]*const[\*]*)$/\1 override/g; t
             s/( "$f"\(.*\))$/\1 override/g; t
             s/( "$f"\(.*\)[ ]*const[\*]*)([ ].*)/\1 override\2/g; t
             s/( "$f"\(.*\))([ ].*)/\1 override\2/g"
      sed -r "$PARSE" "$h" > temp
      mv temp "$h"
    done < virtualNames
  done

  echo "Processing $DO on $DO_ON done"
  exit 0

fi

exit 0
