#!/usr/bin/env bash

LCG=${1:-dev3/latest}
PLATFORM=${2:-x86_64-el9-clang19-opt} 

prefix='<<OSTAP WITH LCG>>'
prefix_error='<<OSTAP WITH LCG ERROR>>'

COLORS=$(tput colors 2> /dev/null)
if [[ $? = 0  && $COLORS -gt 2 ]]
then    
    FWHITE='\033[1;97m'     # White
    BGREEN='\033[42m'       # Green
    FYELLOW='\033[1;93m'    # Yellow
    BRED='\033[6;101m'      # Red
    ##
    COLOR_OK=${FYELLOW}${BGREEN}
    COLOR_ERR=${FYELLOW}${BRED}
    COLOR_OFF='\033[0m' 
    ##
    prefix=${COLOR_OK}${prefix}${COLOR_OFF}
    prefix_error=${COLOR_ERR}${prefix_error}${COLOR_OFF}
    ## 
fi

echo -e ${prefix}' LCG version='${LCG} ' PLATFORM='${PLATFORM}

# ================================================================================
## Wake up the cvmfs fuse mount
#  - on Windows WSL some action is required
# ================================================================================
for run in {1..50}; do

    for the_dir in /cvmfs/sft.cern.ch/                             \
		   /cvmfs/sft.cern.ch/lcg                          \
		   /cvmfs/sft.cern.ch/lcg/views                    \
		   /cvmfs/sft-nightlies.cern.ch                    \
		   /cvmfs/sft-nightlies.cern.ch/lcg                \
		   /cvmfs/sft-nightlies.cern.ch/lcg/views          \
		   /cvmfs/sft.cern.ch/lcg/views/${LCG}             \
		   /cvmfs/sft.cern.ch/lcg/views/${LCG}/${PLATFORM}
    do
	
	if [[ ! -d $the_dir ]]
	then
	    ( ( ls -al $the_dir >/dev/null 2>&1 ) ;
	      ( cd     $the_dir >/dev/null 2>&1 ; ls -al .  >/dev/null 2>&1 ) ;
	      ( ls -al $the_dir >/dev/null 2>&1 ) )
	fi
	
    done 
    
    for the_file in /cvmfs/sft.cern.ch/lcg/views/setupViews.sh  \
		    /cvmfs/sft.cern.ch/lcg/views/setupViews.csh
    do
	( ( ls -al $the_file >/dev/null 2>&1 ) ;
	  ( cat    $the_file >/dev/null 2>&1 ) ; 
	  ( ls -al $the_file >/dev/null 2>&1 ) )
    done
    
    ( ( ls -al /cvmfs/sft.cern.ch/lcg/views/${LCG}/${PLATFORM}/setup.sh > /dev/null 2>&1 ) ;
      ( cat    /cvmfs/sft.cern.ch/lcg/views/${LCG}/${PLATFORM}/setup.sh > /dev/null 2>&1 ) ;
      ( ls -al /cvmfs/sft.cern.ch/lcg/views/${LCG}/${PLATFORM}/setup.sh > /dev/null 2>&1 ) )
        
    if [[ -d /cvmfs/sft.cern.ch                          &&
	  -d /cvmfs/sft.cern.ch/lcg                      &&
	  -d /cvmfs/sft.cern.ch/lcg/views                &&
	  -d /cvmfs/sft-nightlies.cern.ch                &&
	  -d /cvmfs/sft-nightlies.cern.ch/lcg            &&
	  -d /cvmfs/sft-nightlies.cern.ch/lcg/views      &&
	  -f /cvmfs/sft.cern.ch/lcg/views/setupViews.sh  &&
	  -f /cvmfs/sft.cern.ch/lcg/views/setupViews.csh ]] 
    then
	break
    else
	echo -e ${prefix}' Make a try to wake up cvmfs #'$run 
	sleep 2
    fi
    
done

( ls -al  /cvmfs/sft.cern.ch/lcg/releases/binutils/ 2>&1 > /dev/null )

if [[ ${LCG} && -d /cvmfs/sft.cern.ch/lcg/views/${LCG} ]]
then
    true 
else
    echo -e ${prefix_error}' Valid LCGs are:' `ls /cvmfs/sft.cern.ch/lcg/views`
    return 110
fi

if [[ ${PLATFORM} && -d /cvmfs/sft.cern.ch/lcg/views/${LCG}/${PLATFORM} ]]
then
    true
else
    echo -e ${prefix_error}' Valid platforms are:' `ls /cvmfs/sft.cern.ch/lcg/views/$LCG`
    return 111
fi

LCG_VIEWS=/cvmfs/sft.cern.ch/lcg/views
LCG_BUILD=${LCG_VIEWS}/${LCG}/${PLATFORM}
LCG_SETUP=${LCG_BUILD}/setup.sh 

if [[ ${LCG} && ${PLATFORM}   &&
       -d ${LCG_VIEWS}        && 
       -d ${LCG_BUILD}        &&
       -f ${LCG_SETUP}        ]]
then
    echo -e ${prefix}$' Source LCG setup   = '${LCG_SETUP}  
    source ${LCG_SETUP}
else
    echo -e ${prefix_error}' No valid LCG/PLATFORM/setup script: ' ${LCG_SETUP}
    return 112 
fi

##  check ROOTSYS 
if [[    ${ROOTSYS}                 &&
      -d ${ROOTSYS}                 &&
      -d ${ROOTSYS}/bin             &&
      -x ${ROOTSYS}/bin/root        &&
      -x ${ROOTSYS}/bin/root.exe    &&
      -x ${ROOTSYS}/bin/root-config ]]	    
then 
    true
else 
    echo -e ${prefix_error}' No valid ROOTSYS directory ' ${ROOTSYS}
    return 113
fi

OSTAP_SOURCE=${3:-${OSTAP_SOURCE}}

source_found=
for source_dir in ${OSTAP_SOURCE:-${OSTAP_HOME}} \
		  ${OSTAP_HOME:-${PWD}}          \
		  ${HOME}/ostap                  \
		  ${PWD}                         \
		  ../                            \
		  ./                      
do
    ## echo 'source_dir' ${source_dir} 
    ## valid structure of the source directory:
    if [[   ${source_dir}                   &&
	 -d ${source_dir}                   &&
	 -d ${source_dir}/cmake             &&
	 -d ${source_dir}/data              &&
	 -d ${source_dir}/docs              &&
	 -d ${source_dir}/examples          &&
	 -d ${source_dir}/ostap             &&
	 -d ${source_dir}/scripts           &&
	 -d ${source_dir}/source            &&
	 -d ${source_dir}/ReleaseNotes      &&		
	 -d ${source_dir}/.aux              &&
	 -f ${source_dir}/CMakeLists.txt    &&
	 -f ${source_dir}/.aux/.build-ostap ]]
    then	
	source_found=$(readlink -f ${source_dir})
	break	
    fi
    
done

if [[    ${source_found} &&
      -d ${source_found} ]]
then
    OSTAP_SOURCE=$(readlink -f ${source_found})
    echo -e ${prefix}' Use OSTAP_SOURCE   = '${OSTAP_SOURCE}
else
    echo -e ${prefix_error}' No ostap source drectory found!'
    return 114 
fi
    
## parameter #4: build directory
OSTAP_BUILD=${4:-${OSTAP_BUILD}}

if   [[    ${OSTAP_BUILD} &&
        -d ${OSTAP_BUILD} &&
        -w ${OSTAP_BUILD} ]]
then
    
    OSTAP_BUILD=$(readlink -f ${OSTAP_BUILD})
    echo -e ${prefix}' Use OSTAP_BUILD    = '${OSTAP_BUILD}
    
elif [[ -d ${OSTAP_SOURCE}/build &&
	-w ${OSTAP_SOURCE}/build ]]
then
    
     OSTAP_BUILD=$(readlink -f ${OSTAP_SOURCE}/build)
     echo -e ${prefix}' Use OSTAP_BUILD    = '${OSTAP_BUILD}
     
elif [[  -w ${OSTAP_SOURCE} &&
       ! -d ${OSTAP_SOURCE}/build ]]
then
    
     mkdir ${OSTAP_SOURCE}/build
     OSTAP_BUILD=$(readlink -f ${OSTAP_SOURCE}/build)
     echo -e ${prefix}' Build directory is created '${OSTAP_BUILD}
     
else
    
    OSTAP_BUILD=`mktemp -d -t ostap-$(date '+%Y-%b-%d')-OSTAP-BUILD-DIR-XXXXXX`
    echo -e ${prefix} ' Build directory is created '${OSTAP_BUILD}
    
fi

## check it again 
if   [[    ${OSTAP_BUILD} &&
	-d ${OSTAP_BUILD} &&
	-w ${OSTAP_BUILD} ]]
then
    OSTAP_BUILD=$(realpath ${OSTAP_BUILD})
else
    echo -e ${prefix_error}' No valid build directory is found! '${OSTAP_BUILD}
    return 115
fi     

## check CMAKE & NINJA

if command -v cmake &> /dev/null 
then
    echo -e "${prefix}"' CMAKE             : '$(which cmake   )
    echo -e "${prefix}"' CMAKE version     : '$(cmake --version | grep -Eo "[0-9]\.[0-9]+\.[0-9]" )
else
   echo -e "${prefix_error}"' CMAKE is not found!'
   return 116
fi

if command -v ctest &> /dev/null 
then
    echo -e "${prefix}"' CTEST             : '$(which ctest   )
    echo -e "${prefix}"' CTEST version     : '$(ctest --version | grep -Eo "[0-9]\.[0-9]+\.[0-9]" )
else
   echo -e "${prefix_error}"' CTEST is not found!'
   return 117 
fi

if command -v cpack &> /dev/null 
then
    echo -e "${prefix}"' CPACK             : '$(which cpack   )
    echo -e "${prefix}"' CPACK version     : '$(cpack --version | grep -Eo "[0-9]\.[0-9]+\.[0-9]" )
else
   echo -e "${prefix_error}"' CPACK is not found!'
   return 118 
fi

if command -v ninja &> /dev/null 
then
    echo -e "${prefix}"' NINJA             : '$(which ninja   )
    echo -e "${prefix}"' NINJA version     : '$(ninja --version | grep -Eo "[0-9]\.[0-9]+\.[0-9]" )
else
   echo -e "${prefix_error}"' NINJA is not found!'
   return 119 
fi 

if [[ -f ${OSTAP_BUILD}/build.ninja ]]
then
    if command -v ninja &> /dev/null 
    then
	( echo -e ${prefix}' Clean  OSTAP_BUILD   build remnants   '${OSTAP_BUILD}  ; cd ${OSTAP_BUILD} ; ninja clean )
    fi
fi

( echo -e ${prefix}' Remove OSTAP_BUILD   remnants&garbage '${OSTAP_BUILD}  ;
  cd ${OSTAP_BUILD} ;
  rm -rf CM* CP* CT* *nin* scripts/ source/ ostap/ examples/ Testing/ Ma* .nin* Dart* cmake* instal* packages Tes* *.py~ *.C~ __* _CPack* \#* *~ .*~ .\#* )

## parameter #5: install directory 
OSTAP_INSTALL=${5:-${OSTAP_INSTALL}}

if   [[   ${OSTAP_INSTALL} &&
       -d ${OSTAP_INSTALL} &&
       -w ${OSTAP_INSTALL} ]]
then
    OSTAP_INSTALL=$(realpath ${OSTAP_INSTALL})
    ( echo -e ${prefix}' Clean  OSTAP_INSTALL directory        '${OSTAP_INSTALL} ;
      cd ${OSTAP_INSTALL} ;
      rm -rf .footprints .ostap.build .ostaprc .rootlogon.C cmake examples include lib packages scripts thisostap.sh )
    
elif [[     ${OSTAP_INSTALL} &&
         -d ${OSTAP_INSTALL} &&
       ! -w ${OSTAP_INSTALL} ]]
then
    echo -e ${prefix_error}' Directory OSTAP_INSTALL is not writeable! '${OSTAP_INSTALL}
    return 120
else
    OSTAP_INSTALL=${OSTAP_BUILD}/INSTALL/LCG${LCG_VERSION}/${PLATFORM}
    OSTAP_INSTALL=$(realpath -m ${OSTAP_INSTALL})
    ## echo -e ${prefix}' Use OSTAP_INSTALL  = '${OSTAP_INSTALL}
fi

echo -e ${prefix}' LCG VERSION    : '${LCG}
echo -e ${prefix}' LCG PLATFORM   : '${PLATFORM}
echo -e ${prefix}' LCG BUILD      : '${LCG_BUILD}
echo -e ${prefix}' ROOTSYS        : '${ROOTSYS}
echo -e ${prefix}' OSTAP_SOURCE   : '${OSTAP_SOURCE}
echo -e ${prefix}' OSTAP_INSTALL  : '${OSTAP_INSTALL}
echo -e ${prefix}' OSTAP_BUILD    : '${OSTAP_BUILD}

## the actual build-script 
source ${OSTAP_SOURCE}/.aux/.build-ostap ${OSTAP_SOURCE} ${OSTAP_INSTALL} ${OSTAP_BUILD}

result=$?

echo -e ${prefix}' LCG VERSION    : '${LCG}
echo -e ${prefix}' LCG PLATFORM   : '${PLATFORM}
echo -e ${prefix}' LCG BUILD      : '${LCG_BUILD}

if [[ $result -eq 0 ]]
then
    echo -e ${prefix}' RESULT         : 'SUCCESS
else
    echo -e ${prefix_error}' RESULT     : '${result}
fi

return ${result}
