#!/bin/ksh
set -x
domainHome=$1
packageHome=$2
profileDirPath=${packageHome}/etc/profile.d
packageFullName=${packageHome##*/}
packageNameVersion=${packageFullName%_*}
packageName=${packageNameVersion%%_*}
packageVersion=${packageNameVersion##*_}
packageArch=${packageFullName##*_}

cd ${packageHome}

mkdir bin 2>/dev/null
cp .ssm.d/r.pkg-config bin/r.${packageName}_${packageArch}-config

#==== Check dependencies [Should be done in pre-install... not an ssm feature]
if [[ x$EC_ARCH = x ]] ; then
    echo "ERROR: EC_ARCH not defined, must provide an ARCH/Compiler"
    exit 1
fi

version=$(r.${packageName}_all-config --version 2>/dev/null)
if [[ x"$version" != x"${packageVersion}" ]] then
    echo "ERROR: cannot install, missing package all or wrong version: $version"
    exit 1
fi

#packageAllName=${packageName}_${packageVersion}_all
#packageAllHome=${domainHome}/$packageAllName
#if [[ ! -d ${packageAllHome} ]] ; then
#    echo "ERROR: cannot install, missing package: $packageAllHome"
#    exit 1
#fi


#==== Compile libs

checkobj(){
    _malib=$1
    _name=$2
    cnt=0
    errorlist=""
    for i in `ls *.ftn* *.cdk90 *.c *.cpp 2> /dev/null` ; do
        f=`echo $i | sed 's/\.ftn.*//' | sed 's/\.cdk90//' | sed 's/\.cpp//' | sed 's/\.c//' `
        if [ ! -s ${_malib}/$f.o ] ; then
            errorlist="$errorlist $i"
            echo "MISSING ${_malib}/$f.o: $(ls $i) : $(ls ${_malib}/$f.o 2>/dev/null)"
            let cnt=cnt+1
        fi
    done
    if [[ cnt -gt 0 ]] ; then
        echo "ERROR: Problem with $errorlist"
        echo "---- ABORT ----"
        exit 1
    else
        echo "Obj for ${_name}: $(ls -1 ${_malib}/*.o 2>/dev/null|wc -l) [src: $(ls -1 *.ftn* *.cdk90 *.c *.cpp 2>/dev/null|wc -l) ]"
    fi

}

#rcspath="`${packageAllHome}/bin/r.${packageName}_all-config --rcspath`"
rcspath="$(r.${packageName}_all-config --rcspath 2>/dev/null)"
packageAllHome=$(echo ${rcspath%%:*})
packageAllHome=$(echo ${packageAllHome%/*})

#TODO: add support for many EC_ARCH (compiler version)
#for mycomppkg in $compiler_list ; do
#    . r.ssmuse.dot $mycomp

   LIBDIR=${packageHome}/lib/$EC_ARCH
   mkdir -p ${LIBDIR} 2>/dev/null
   MODDIR=${packageHome}/include/$EC_ARCH
   mkdir -p ${MODDIR} 2>/dev/null

   production_date="$(date '+%Y-%m-%d %H:%M %Z')"
   chmod u+w $MODDIR
   cat > ${MODDIR}/${packageName}_version.inc << EOF
      character(len=50),parameter :: RPNPHY_NAME_S = 'RPNPHY'
      character(len=50),parameter :: RPNPHY_VERSION_S = '${packageVersion}'
      character(len=50),parameter::RPNPHY_DSTP_S='${production_date}'
      character(len=50),parameter :: RPNPHY_EC_ARCH_S = '${EC_ARCH}'
EOF
    cd $MODDIR


    MALIB=malib${EC_ARCH}

    liblist=$(ls -d ${packageAllHome}/RCS_*)

    for item in $liblist ; do
        rcsname=${item##*/}
        partname=$(echo ${rcsname#*_} | tr 'A-Z' 'a-z')
        libname=${packageName}_$partname
        #if [[ x$partname != xstubs ]] ; then

            cd ${TMPDIR:-/tmp}
            chmod -R u+w tmpwkdir$$
            /bin/rm -rf tmpwkdir$$
            mkdir tmpwkdir$$
            cd tmpwkdir$$
            ouv_exp base -RCSPATH $rcspath #${packageAllHome}/RCS ${packageAllHome}/$rcsname
            r.make_exp
            mkdir -p ${MALIB}
            #make genlib
            cd ${packageAllHome}/src/$partname
            cp * ${TMPDIR:-/tmp}/tmpwkdir$$
            cd ${TMPDIR:-/tmp}/tmpwkdir$$
            cp ${MODDIR}/${packageName}_version.inc .
            make objloc
            
            set +x
            checkobj ${MALIB} $libname
            set -x
            
            #TODO: check that needed .mod are present
            
            /bin/rm -f ${LIBDIR}/lib${libname}.a
            r.ar rv ${LIBDIR}/lib${libname}.a ${MALIB}/*.o
            if [[ ! -r ${LIBDIR}/lib${libname}.a ]] ; then
                echo "ERROR lib not Found: ${LIBDIR}/lib${libname}.a"
                exit 1
            fi
            
            cp ${MALIB}/*.[mM][oO][dD] ./*.[mM][oO][dD]  $MODDIR 2>/dev/null

            chmod -R u+w tmpwkdir$$
            /bin/rm -rf tmpwkdir$$

        #fi
    done
    
    #support older ARCH names
    here=`pwd`
    #EC_ARCH_OLD=$(echo $EC_ARCH | tr '/' '_')
    #EC_ARCH_NEW=$(echo $EC_ARCH | tr '_' '/')
    COMP_ARCH=${COMP_ARCH:-${EC_ARCH##*/}}
    EC_ARCH_OLD=${BASE_ARCH}_${COMP_ARCH}
    EC_ARCH_NEW=${BASE_ARCH}/${COMP_ARCH}
    for mydir in ${packageHome}/lib ${packageHome}/include ; do
       cd $mydir
       mkdir -p $EC_ARCH_NEW 2>/dev/null
       rmdir $EC_ARCH_NEW 2>/dev/null
       mv -f $EC_ARCH_OLD $EC_ARCH_NEW 2>/dev/null || mkdir -p $EC_ARCH_NEW 2>/dev/null
       /bin/rm -f $EC_ARCH_OLD 2>/dev/null
       ln -s ./$EC_ARCH_NEW/. $EC_ARCH_OLD
    done
    cd $here

    #merge libs
    here=`pwd`
    cd $LIBDIR
    liblist=$(ls -1 *.a)

    OBJDIR=${TMPDIR:-/tmp}/tmpwkdir$$
    /bin/rm -rf $OBJDIR 2>/dev/null
    mkdir -p $OBJDIR
    cd $OBJDIR
    for item in $liblist ; do
       domerge=1
       [[ x$(echo $item | grep ${packageName}_main.a) != x ]] && domerge=0
       [[ x$(echo $item | grep _stubs.a) != x ]] && domerge=0
       [[ x$(echo $item | grep _tests.a) != x ]] && domerge=0
       # [[ x$(echo $item | grep ${packageName}_utils.a) != x ]] && domerge=0
       [[ x$(echo $item | grep ${packageName}_v4d.a) != x ]] && domerge=0
        if [[ x$domerge == x1 ]] ; then
            r.ar xv $LIBDIR/$item
            /bin/rm -f $LIBDIR/$item
        fi
    done

    libname=${packageName}
    /bin/rm -f ${LIBDIR}/lib${libname}.a
    #for item in $(ls *.o) ; do
      #  r.ar rv ${LIBDIR}/lib${libname}.a $item   
    #done
    r.ar rv ${LIBDIR}/lib${libname}.a *.o
    cd $here
    /bin/rm -rf $OBJDIR 2>/dev/null

#done

exitstatus=0
[[ ! -r ${LIBDIR}/lib${libname}.a ]] && exitstatus=1

exit $exitstatus

