#!/bin/bash

if [ -z "$CC" ]; then
  CC=gcc
fi
if [ -z "$CXX" ]; then
  CXX=g++
fi

# check for a C compiler
function check_cc()
{
  if [ ! -z "$CC" ]; then
    if [ ! -x "`which "$CC"`" ]; then
      echo "`which "$CC"` not executable, falling back to cc"
      CC="cc"
    fi
  else
    CC="cc"
    if [ ! -x "`which "$CC"`" ]; then
      echo "*** No C compiler found"
      return 1
    fi
  fi

  FILE="`tempfile`"
  OUTFILE="`tempfile`"
  echo "int main(void) { return 0; }" > "$FILE"
  $CC -x "c" -o "$OUTFILE" "$FILE" 2>&1 | cat >>config.log

  OK="0"
  if [ ! -s "$OUTFILE" ]; then
    echo "*** Couldn't compile test program."
  else
    chmod +x "$OUTFILE"
    "$OUTFILE"
    if [ "$?" -eq "0" ]; then
      OK="1"
    fi
  fi

  rm "$FILE"
  rm "$OUTFILE"

  if [ "$OK" -eq "0" ]; then
    return 1
  fi

  echo "Found a working C compiler ($CC)."
  return 0
}

# check for a C++ compiler
function check_cxx()
{
  if [ ! -z "$CXX" ]; then
    if [ ! -x "`which "$CXX"`" ]; then
      echo "`which "$CXX"` not executable, falling back to c++"
      CXX="c++"
    fi
  else
    CXX="c++"
    if [ ! -x "`which "$CXX"`" ]; then
      echo "*** No C++ compiler found"
      return 1
    fi
  fi

  FILE="`tempfile`"
  OUTFILE="`tempfile`"
  echo "int main(void) { return 0; }" > "$FILE"
  $CXX -x "c++" -o "$OUTFILE" "$FILE" 2>&1 | cat >>config.log

  OK="0"
  if [ ! -s "$OUTFILE" ]; then
    echo "*** Couldn't compile test program."
  else
    chmod +x "$OUTFILE"
    "$OUTFILE"
    if [ "$?" -eq "0" ]; then
      OK="1"
    fi
  fi

  rm "$FILE"
  rm "$OUTFILE"

  if [ "$OK" -eq "0" ]; then
    return 1
  fi

  echo "Found a working C++ compiler ($CXX)."
  return 0
}

# check for libavifile
function check_libavifile()
{
  echo "Checking avifile..."

  if [ ! -x "`which avifile-config`" ]; then
    echo "*** Couldn't find avifile-config. (You can get avifile at http://avifile.sourceforge.net/)"
    exit 1
  fi

  FILE="`tempfile`"
  OUTFILE="`tempfile`"
  echo "#include <avifile.h>" > "$FILE"
  echo "int main(void) { return 0; }" >> "$FILE"
  $CXX -x "c++" -o "$OUTFILE" "$FILE" `avifile-config --libs` `avifile-config --cflags` 2>&1 | cat >>config.log

  OK="0"
  if [ ! -s "$OUTFILE" ]; then
    echo "*** Couldn't compile avifile test."
  else
    chmod +x "$OUTFILE"
    "$OUTFILE"
    if [ "$?" -eq "0" ]; then
      OK="1"
    fi
  fi

  rm "$FILE"
  rm "$OUTFILE"

  if [ "$OK" -eq "0" ]; then
    return 1
  fi

  echo "Found libavifile version `avifile-config --version`."
  return 0
}

# check for libsdl
function check_libsdl()
{
  echo "Checking SDL..."

  if [ ! -x "`which sdl-config`" ]; then
    echo "*** Couldn't find sdl-config. (You can get libSDL at http://www.libsdl.org/)"
    exit 1
  fi

  FILE="`tempfile`"
  OUTFILE="`tempfile`"
  echo "#include \"SDL.h\"" > "$FILE"
  echo "#include <stdio.h>" >> "$FILE"
  echo "int main(void) { if (SDL_Init( 0 ) < 0) { printf( \"SDL_Init(): %s\\n\", SDL_GetError() ); return 1; } return 0; }" >> "$FILE"
  $CC -x "c" -o "$OUTFILE" "$FILE" `sdl-config --libs` `sdl-config --cflags` 2>&1 | cat >>config.log

  OK="0"
  if [ ! -s "$OUTFILE" ]; then
    echo "*** Couldn't compile SDL test."
  else
    chmod +x "$OUTFILE"
    "$OUTFILE"
    if [ "$?" -eq "0" ]; then
      OK="1"
    fi
  fi

  rm "$FILE"
  rm "$OUTFILE"

  if [ "$OK" -eq "0" ]; then
    return 1
  fi

  echo "Found SDL version `sdl-config --version`."
  return 0
}

# main configuration routine
echo "`date`" > config.log

check_cc
if [ "$?" -ne "0" ]; then
  echo "*** Couldn't find a working C compiler!"
  exit 1
fi

check_libsdl
if [ "$?" -ne "0" ]; then
  echo "*** Couldn't find a working SDL library!"
  exit 1
fi

echo
echo "Do you want to configure mupen64 to run in a user directory? (Answering no"
echo "will configure it for multi-users usage with the configuration stored in the"
echo "HOME directory)"
read -p "(Y)es or (N)o [Default is: Yes]: " answer

if [ -n "$answer" ]
then
  if [ $(echo $answer | cut -c 1 | tr a-z A-Z) = 'N' ]
  then

    echo "In which prefix do u want to install mupen64 ? [Default: /usr/local/] "
    read answer

    if [ -z $answer ]
    then
      answer="/usr/local/"
    fi

    WITH_HOME=$answer
  fi
fi

# ---- VCR
echo
echo "Do you want to enable VCR support (requires avifile and a C++ compiler)?"
read -p "(Y)es or (N)o [Default is: No]: " answer

if [ -n "$answer" ]
then
  if [ $(echo $answer | cut -c 1 | tr a-z A-Z) = 'Y' ]
  then
    check_cxx
    if [ "$?" -eq "0" ]; then
      check_libavifile
      if [ "$?" -eq "0" ]; then
        VCR_SUPPORT=1
      else
        echo "*** Couldn't find a working avifile library!"
        echo "Disabling VCR support."
      fi
    else
      echo "*** Couldn't find a working C++ compiler!"
      echo "Disabling VCR support."
    fi
  fi
fi

# write config.h
echo
echo "Writing config.h..."

touch config.h.old

if [ -f config.h ]; then
  cp config.h config.h.old
fi

echo "#ifndef CONFIG_H" > config.h
echo "#define CONFIG_H" >> config.h
echo "" >> config.h
if [ -z "$WITH_HOME" ]; then
  echo "#undef WITH_HOME" >> config.h
else
  echo "#define WITH_HOME \"${WITH_HOME}\"" >> config.h
fi

if [ -z "$VCR_SUPPORT" ]; then
  echo "#undef VCR_SUPPORT" >> config.h
else
  echo "#define VCR_SUPPORT 1" >> config.h
fi
echo "" >> config.h
echo "#endif /* CONFIG_H */" >> config.h

CONFIG_CHANGED=0
if [ ! -z "`diff config.h config.h.old`" ]; then
  CONFIG_CHANGED=1
fi

rm config.h.old

# build mupen?
echo
echo "Do you want to build mupen64 now?"
if [ "$CONFIG_CHANGED" -eq "0" ]; then
  echo "Note: The configuration has not been changed since the last time it was written."
fi
read -p "(Y)es or (N)o [Default is: No]: " answer

if [ -n "$answer" ]
then
  if [ $(echo $answer | cut -c 1 | tr a-z A-Z) = 'Y' ]
  then
    echo
    echo "Building mupen64..."

    export CC
    export CXX
    make clean 2>&1 | cat >>config.log
    make 2>&1 | cat >>config.log
    if [ "$?" -ne "0" ] || [ ! -x ./mupen64 ]; then
      echo "Looks like something went wrong when building mupen64 :("
      exit 1
    else
      echo -n "Everything seems to be ok, you can run ./mupen64 now if you have configured mupen64 to be run in a user directory or use "
      echo "the install.sh shell-script to install it in your system otherwise."
    fi
  fi
fi

echo "Everything ok" >> config.log
exit 0
