#!/usr/bin/env bash

read PACKAGE < PACKAGE
read VERSION < VERSION

PREFIX="/usr/local"
BINDIR=$PREFIX"/bin"
DATADIR=$PREFIX"/share"

PATHS="/bin/ /usr/bin/ /usr/local/bin $HOME/bin/"
XPATHS="/usr/ /X11/ /usr/X11/ /usr/X11R6/ /usr/local/X11/"
YPATHS="/usr/ /usr/local/"


DIR=""
FILE=""
FOUNDDIR=""
INFO=false

function basename()
{
  local name="${1##*/}"
  #echo "${name%$2}"
  FILE=${name%$2}
}

function dirname()
{
  local dir="${1%${1##*/}}"
  [ "${dir:=./}" != "/" ] && dir="${dir%?}"
  #echo "$dir"
  DIR=$dir
}

function cercafile ()
{
	local percorsi=$1
	local name=$2

	DIR=""
	FILE=""
	FOUNDDIR=false
	echo -n "Checking $name ... "
	for x in $percorsi
	do
		file=$x$name
		#echo "search in ... $file"
		if ( [ -e "$file" ] ) then
			echo " yes ($file)"
			dirname  "$file"
			basename "$file"
			FOUNDDIR=true
			return 0
		fi
        done

        echo " No, let me retry... "
	return 1
}

function crea_config ()
{
    local outfile=$1
	echo "//"                            >  $outfile
	echo "// config.h "                  >> $outfile
	echo "// generated by configure "    >> $outfile
	echo "//"                            >> $outfile
	echo "#define PACKAGE  \"$PACKAGE\"" >> $outfile
	echo "#define VERSION  \"$VERSION\"" >> $outfile
	echo ""                              >> $outfile
	echo "#define BINDIR  \"$BINDIR\""   >> $outfile
	echo "#define DATADIR \"$DATADIR\""  >> $outfile
	echo "" 			     >> $outfile
	if ( [ "$XPM" = 'true' ] ) then
		echo "#define XPM "  >> $outfile
	fi
	if ( [ "$JPEG" = 'true' ] ) then
		echo "#define JPEG " >> $outfile
	fi

}

function crea_makefile ()
{
	local outfile=$1
	local filerule=$2

	echo "#" > "$outfile"
	echo "# Settings:"				>> "$outfile"
	echo "#"					>> "$outfile"
	echo "PACKAGE          = $PACKAGE"		>> "$outfile"
	echo "VERSION          = $VERSION"		>> "$outfile"

	echo ""						>> "$outfile"
	echo "CPU              = $CPU"			>> "$outfile"
	echo "IS_64BIT         = $IS_64BIT"		>> "$outfile"
	echo "WHICH            = $WHICH"		>> "$outfile"
	echo "TOUCH            = $TOUCH"		>> "$outfile"
	echo "CC               = $CC"			>> "$outfile"
	echo "X11_INC_DIR      = $X11_INC_DIR"		>> "$outfile"
	echo "X11_LIB32        = $X11_LIB32"		>> "$outfile"
	echo "X11_LIB32_DIR    = $X11_LIB32_DIR"	>> "$outfile"
	echo "X11_LIB64        = $X11_LIB64"		>> "$outfile"
	echo "X11_LIB64_DIR    = $X11_LIB64_DIR"	>> "$outfile"

	echo "XPM_INC_DIR      = $XPM_INC_DIR"		>> "$outfile"
	echo "XPM_LIB32        = $XPM_LIB32"            >> "$outfile"
	echo "XPM_LIB32_DIR    = $XPM_LIB32_DIR"        >> "$outfile"
	echo "XPM_LIB64        = $XPM_LIB64"            >> "$outfile"
	echo "XPM_LIB64_DIR    = $XPM_LIB64_DIR"        >> "$outfile"

	echo "JPEG_INC_DIR     = $JPEG_INC_DIR"		>> "$outfile"
	echo "JPEG_LIB32       = $JPEG_LIB32"		>> "$outfile"
	echo "JPEG_LIB32_DIR   = $JPEG_LIB32_DIR"	>> "$outfile"
	echo "JPEG_LIB64       = $JPEG_LIB64"		>> "$outfile"
	echo "JPEG_LIB64_DIR   = $JPEG_LIB64_DIR"	>> "$outfile"

	echo "PNG_INC_DIR      = $PNG_INC_DIR"		>> "$outfile"
	echo "PNG_LIB32        = $PNG_LIB32"		>> "$outfile"
	echo "PNG_LIB32_DIR    = $PNG_LIB32_DIR"	>> "$outfile"
	echo "PNG_LIB64        = $PNG_LIB64"		>> "$outfile"
	echo "PNG_LIB64_DIR    = $PNG_LIB64_DIR"	>> "$outfile"

	echo "BINDIR           = $BINDIR"               >> "$outfile"
	echo "DATADIR          = $DATADIR"              >> "$outfile"
	echo ""						>> "$outfile"
	echo $filerule
	cat $filerule >> "$outfile"

}

if ( [ "$0" != "./configure" ] ) then
cat << EOF
Prego esegui il programma configure nella directory src 
utilizzo: ./configure [--help] [paths]
EOF
        exit 2
fi


for parm in "$@" ; do
  #echo $parm
  case "$parm" in
  --bindir=*)
    BINDIR=`echo $parm | cut -d '=' -f 2`
    ;;
  --datadir=*)
    DATADIR=`echo $parm | cut -d '=' -f 2`
    ;;

  esac

done


#--------------------------------------
# Check if the user has asked for help.
#--------------------------------------
if ( [ "$1" = '-?' ] ) then
        SHOW_USAGE=true
elif ( [ "$1" = 'help' ] ) then
        SHOW_USAGE=true
elif ( [ "$1" = '--help' ] ) then
        SHOW_USAGE=true
fi

if ( [ "$1" = '--info' ] ) then
        INFO=true
fi

#--------------------------------------
# Usage
#--------------------------------------
if ( [ "$SHOW_USAGE" = 'true' ] ) then
cat << EOF
Usage: ./configure [options] [paths]'

Options:
--help			show this page
--info			show info
--bindir=prefix/bin     default=$BINDIR
--datadir=prefix/data   default=$DATADIR

EOF
        exit 0
fi

#--------------------------------------
# Echo
#--------------------------------------
echo "# Configure script"

#--------------------------------------
# which
#--------------------------------------
if ( [ "$WHICH" = "" ] ) then
	cercafile "$PATHS" "which"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		WHICH="$DIR/$FILE"
	fi
	
fi
#--------------------------------------
# touch
#--------------------------------------
if ( [ "$TOUCH" = "" ] ) then
	cercafile "$PATHS" "touch"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		TOUCH="$DIR/$FILE"
	fi
fi

#--------------------------------------
# arch
#--------------------------------------
if ( [ "$ARCH" = "" ] ) then
	cercafile "$PATHS" "arch"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		ARCH="$DIR/$FILE"
	fi
	if ( [ "$ARCH" = "" ] ) then
		cercafile "$PATHS" "uname"
		if ( [ "$FOUNDDIR" = "true" ] ) then
			ARCH="$DIR/$FILE"
		fi
	fi
	if ( [ "$ARCH" != "" ] ) then
		CPU=`$ARCH`;
	else CPU="i386";
	fi
fi

case $CPU in
  "x86_64" | "amd64")	
	IS_64BIT=true
	;;
  *)	
	IS_64BIT=false
	;;
esac


#--------------------------------------
# gcc
#--------------------------------------
if ( [ "$CC" = "" ] ) then
	cercafile "$PATHS" "gcc"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		CC="$DIR/$FILE"
	fi
fi
if ( [ "$CC" = "" ] ) then
	cercafile "$PATHS" "cc"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		CC="$DIR/$FILE"
	fi
fi
if ( [ "$CC" = "" ] ) then
        # 
        echo "Couldn't find 'gcc' compiler!"
	exit 2
fi

#--------------------------------------
# ar
#--------------------------------------
if ( [ "$AR" = "" ] ) then
	cercafile "$PATHS" "ar"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		AR="$DIR/$FILE"
	fi
fi
if ( [ "$AR" = "" ] ) then
        # 
        echo "Couldn't find 'ar' for libraries"
        exit 2
fi

#--------------------------------------
# ld
#--------------------------------------
if ( [ "$LD" = "" ] ) then
	cercafile "$PATHS" "ld"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		LD="$DIR/$FILE"
	fi
fi
if ( [ "$LD" = "" ] ) then
        #
        echo "Couldn't find 'ld' linker!"
        exit 2
fi

#--------------------------------------
# ranlib
#--------------------------------------
if ( [ "$RANLIB" = "" ] ) then
	cercafile "$PATHS" "ranlib"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		RANLIB="$DIR/$FILE"
	fi
fi
if ( [ "$RANLIB" = "" ] ) then
        #
        echo "Couldn't find 'ranlib' for libraries!"
	exit 2
fi

#--------------------------------------
# Xlib.h
#--------------------------------------
if ( [ "$X11_INC_DIR" = "" ] ) then
	cercafile "$XPATHS" "include/Xlib.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		X11_INC_DIR=$DIR
	fi
fi
if ( [ "$X11_INC_DIR" = "" ] ) then
	cercafile "$XPATHS" "include/X11/Xlib.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		X11_INC_DIR=$DIR
	fi
fi
if ( [ "$X11_INC_DIR" = "" ] ) then
	#
        echo "Couldn't find 'Xlib.h'"
        exit 2
fi

#--------------------------------------
# libX11.so  
#--------------------------------------
if ( [ "$X11_LIB64" = "" ] && $IS_64BIT) then
	cercafile "$XPATHS" "lib64/libX11.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		X11_LIB64="$DIR/$FILE"
		X11_LIB64_DIR=$DIR
	fi
fi
if ( [ "$X11_LIB32" = "" ] ) then
	cercafile "$XPATHS" "lib/libX11.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		X11_LIB32="$DIR/$FILE"
		X11_LIB32_DIR=$DIR
	fi
fi
if ( [ "$X11_LIB64" = "" ]  && [ "$X11_LIB32" = "" ] ) then
	#
        echo "Couldn't find 'libX11'"
        exit 2
fi

#--------------------------------------
# xpm.h
#--------------------------------------
if ( [ "$XPM_INC_DIR" = "" ] ) then
	cercafile "$XPATHS" "include/xpm.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		XPM_INC_DIR=$DIR
	fi
fi
if ( [ "$XPM_INC_DIR" = "" ] ) then
	cercafile "$XPATHS" "include/X11/xpm.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		XPM_INC_DIR=$DIR
	fi
fi
#--------------------------------------
# libXpm.so
#--------------------------------------
if ( [ "$XPM_LIB64" = "" ] && $IS_64BIT) then
	cercafile "$XPATHS" "lib64/libXpm.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		XPM_LIB64="$DIR/$FILE"
		XPM_LIB64_DIR=$DIR
	fi
fi
if ( [ "$XPM_LIB32" = "" ] ) then
	cercafile "$XPATHS" "lib/libXpm.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		XPM_LIB32="$DIR/$FILE"
		XPM_LIB32_DIR=$DIR
	fi
fi
XPM=true;
if ( ([ "$XPM_LIB64" = "" ]  && [ "$XPM_LIB32" = "" ]) || [ "$XPM_INC_DIR" = "" ] )  then
	#
        echo "Couldn't find 'xpm'"
	XPM=false
fi

#--------------------------------------
# include/jpeglib.h
#--------------------------------------
if ( [ "$JPEG_INC_DIR" = "" ] ) then
	cercafile "$YPATHS" "include/jpeglib.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		JPEG_INC_DIR=$DIR
	fi
fi
if ( [ "JPEG_INC_DIR" = "" ] ) then
	cercafile "$YPATHS" "include/JPEG/jpeglib.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		JPEG_INC_DIR=$DIR
	fi
fi
#--------------------------------------
# libjpeg.so
#--------------------------------------
if ( [ "$JPEG_LIB64" = "" ] && $IS_64BIT) then
	cercafile "$YPATHS" "lib64/libjpeg.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		JPEG_LIB64="$DIR/$FILE"
		JPEG_LIB64_DIR=$DIR
	fi
fi
if ( [ "$JPEG_LIB32" = "" ] ) then
	cercafile "$YPATHS" "lib/libjpeg.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		JPEG_LIB32="$DIR/$FILE"
		JPEG_LIB32_DIR=$DIR
	fi
fi

#--------------------------------------
# include/png.h
#--------------------------------------
if ( [ "$PNG_INC_DIR" = "" ] ) then
	cercafile "$YPATHS" "include/png.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		PNG_INC_DIR=$DIR
	fi
fi
if ( [ "PNG_INC_DIR" = "" ] ) then
	cercafile "$YPATHS" "include/PNG/png.h"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		PNG_INC_DIR=$DIR
	fi
fi
#--------------------------------------
# libpng.so     (/usr/lib64/libpng.so)
#--------------------------------------
if ( [ "$PNG_LIB64" = "" ] && $IS_64BIT) then
	cercafile "$YPATHS" "lib64/libpng.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		PNG_LIB64=$DIR"lib64/libpng.so"
		PNG_LIB64_DIR=$DIR"lib64"
	fi
fi
if ( [ "$PNG_LIB32" = "" ] ) then
	cercafile "$YPATHS" "lib/libpng.so"
	if ( [ "$FOUNDDIR" = "true" ] ) then
		PNG_LIB32="$DIR/$FILE"
		PNG_LIB32_DIR=$DIR
	fi
fi

#--------------------------------------
# Final Step
#--------------------------------------
MAX_INC_DIR="/usr/include/max"
MAX_LIB32_DIR="/usr/lib/max/"
MAX_LIB32="/usr/lib/max/maxlib.a"

#--------------------------------------
# INFO DEBUG
#--------------------------------------
if ( [ "$INFO" != "false" ] ) then
        echo "# Settings:"
	echo "CPU              = $CPU"
	echo "IS_64BIT         = $IS_64BIT"
	echo "WHICH            = $WHICH"
	echo "TOUCH            = $TOUCH"
        echo "CC               = $CC"
        echo "AR               = $AR"
        echo "RANLIB           = $RANLIB"
        echo "LD               = $LD"
        echo "MAKE_STATIC_LIB  = $AR rc"
        echo "MAKE_DYNAMIC_LIB = $LD $DLL_FLAGS"
        echo "X11_LIB64        = $X11_LIB64"
        echo "X11_LIB64_DIR    = $X11_LIB64_DIR"
        echo "X11_LIB32        = $X11_LIB32"
        echo "X11_LIB32_DIR    = $X11_LIB32_DIR"
        echo "X11_INC_DIR      = $X11_INC_DIR"
        echo "MAX_LIB64        = $MAX_LIB64"
        echo "MAX_LIB64_DIR    = $MAX_LIB64_DIR"
        echo "MAX_LIB32        = $MAX_LIB32"
        echo "MAX_LIB32_DIR    = $MAX_LIB32_DIR"
        echo "MAX_INC_DIR      = $MAX_INC_DIR"
	echo "XPM_LIB64        = $XPM_LIB64"
	echo "XPM_LIB64_DIR    = $XPM_LIB64_DIR"
	echo "XPM_LIB32        = $XPM_LIB32"
	echo "XPM_LIB32_DIR    = $XPM_LIB32_DIR"
	echo "JPEG_LIB64       = $JPEG_LIB64"
	echo "JPEG_LIB64_DIR   = $JPEG_LIB64_DIR"
	echo "JPEG_LIB32       = $JPEG_LIB32"
	echo "JPEG_LIB32_DIR   = $JPEG_LIB32_DIR"
	echo "JPEG_INC_DIR     = $JPEG_INC_DIR"
	echo "PNG_LIB64        = $PNG_LIB64"
	echo "PNG_LIB64_DIR    = $PNG_LIB64_DIR"
	echo "PNG_LIB32        = $PNG_LIB32"
	echo "PNG_LIB32_DIR    = $PNG_LIB32_DIR"
	echo "PNG_INC_DIR      = $PNG_INC_DIR"
	echo "BINDIR           = $BINDIR"

fi

# Now create a Makefile.
echo "# Creating ./Makefile(s)"
crea_makefile "./Makefile" "rules/x11rules.txt"
crea_makefile "./examples/Makefile" "rules/x11rules.examples.txt"
crea_makefile "./test/Makefile" "rules/x11rules.test.txt"

echo "# Creating ./src/config.h"
crea_config "./src/config.h"
exit 0

