#!/usr/bin/env bash

exec 2>&1

ROOT_UID="0"

#Check if run as root
if [ "$UID" -ne "$ROOT_UID" ]; then
  echo "You must have 'sudo' right to do that!"
  exit 1
fi

rm -rf ./liquidsoap-compile_logs
mkdir -p ./liquidsoap-compile_logs

showhelp() {
  echo "Usage: run.sh [options] [parameters]
-c all|ubuntu_lucid_32    Compile liquidsoap on all platforms or specified platform.
-b all|ubuntu_lucid_32    Build shroot environments for all platforms or specified platform.
-u username               Local username will be used as sudo user of chroot env. Must be assigned before -b options"
  exit 0
}

build_env() {
  if [ $sudo_user = "-1" ]; then
    echo "Please use -u to assign sudo username before build environments."
    exit 1
  fi

  echo "build_env $1"
  #exec > >(tee ./liquidsoap_compile_logs/build_env_$1.log)
  os=$(echo $1 | awk '/(debian)/')
  cpu=$(echo $1 | awk '/(64)/')
  dist=$(echo $1 | awk -F "_" '{print $2}')

  rm -f /etc/schroot/chroot.d/$1.conf
  if cat /etc/passwd | awk -F:'{print $1}' | grep "tmp" > /dev/null 2>&1; then
    echo "User tmp exists."
  else
    useradd tmp
    echo "User tmp is created."
  fi

  apt-get update
  apt-get --force-yes -y install debootstrap dchroot
  echo [$1] > /etc/schroot/chroot.d/$1.conf
  echo description=$1 >> /etc/schroot/chroot.d/$1.conf
  echo directory=/srv/chroot/$1 >> /etc/schroot/chroot.d/$1.conf
  echo type=directory >> /etc/schroot/chroot.d/$1.conf
  echo users=$sudo_user,tmp >> /etc/schroot/chroot.d/$1.conf
  echo root-users=$sudo_user >> /etc/schroot/chroot.d/$1.conf
  rm -rf /srv/chroot/$1
  mkdir -p /srv/chroot/$1

  #cp liquidsoap_compile.sh /srv/chroot/$1/
  if [ "$os" = "" ]; then
    if [ "$cpu" = "" ]; then
      echo "debootstrap --variant=buildd --arch=i386 $dist /srv/chroot/$1 http://archive.ubuntu.com/ubuntu/"
      debootstrap --variant=buildd --arch=i386 $dist /srv/chroot/$1 http://archive.ubuntu.com/ubuntu/
    else
      echo "debootstrap --variant=buildd --arch=amd64 $dist /srv/chroot/$1 http://archive.ubuntu.com/ubuntu/"
      debootstrap --variant=buildd --arch=amd64 $dist /srv/chroot/$1 http://archive.ubuntu.com/ubuntu/
    fi
  else
    if [ "$cpu" = "" ]; then
      echo "debootstrap --variant=buildd --arch=i386 $dist /srv/chroot/$1 http://ftp.debian.com/debian/"
      debootstrap --variant=buildd --arch=i386 $dist /srv/chroot/$1 http://ftp.debian.com/debian/
    else
      echo "debootstrap --variant=buildd --arch=amd64 $dist /srv/chroot/$1 http://ftp.debian.com/debian/"
      debootstrap --variant=buildd --arch=amd64 $dist /srv/chroot/$1 http://ftp.debian.com/debian/
    fi
  fi

}

compile_liq() {
  echo "complie_liq $1"
  #exec > >(tee ./liquidsoap_compile_logs/compile_liq_$1.log)
  binfilename=$(echo $1 | sed -e 's/ubuntu/liquidsoap/g' -e 's/debian/liquidsoap/g' -e 's/32/i386/g' -e 's/64/amd64/g')
  rm -f /srv/chroot/$1/liquidsoap-compile.sh
  rm -f /srv/chroot/$1/liquidsoap
  cp liquidsoap-compile.sh /srv/chroot/$1/
  schroot -c $1 -u root -d / -- /liquidsoap-compile.sh
  cp /srv/chroot/$1/liquidsoap ./$binfilename
  if [ $? = 0 ]; then
    echo "$binfilename is generated successfully"
  else
    mv ./liquidsoap-compile_logs/compile_liq_$1.log ./liquidsoap-compile_logs/fail_to_compile_liq_$1.log
  fi
}

os_versions=("ubuntu_lucid_32" "ubuntu_lucid_64" "ubuntu_precise_32" "ubuntu_precise_64" "ubuntu_quantal_32" "ubuntu_quantal_64" "ubuntu_raring_32" "ubuntu_raring_64" "debian_squeeze_32" "debian_squeeze_64" "debian_wheezy_32" "debian_wheezy_64")

num=${#os_versions[@]}
flag=
os=
sudo_user="-1"

if [ x$1 = x ]; then
  showhelp
fi

while getopts b:c:u: arg; do
  case $arg in
    b)
      if [ "$OPTARG" = "all" ]; then
        echo "Building all platforms on server..."
        for i in $(seq 0 $((num - 1))); do
          build_env ${os_versions[$i]} | tee ./liquidsoap-compile_logs/build_env_${os_versions[$i]}.log
        done
      else
        flag=1
        for i in $(seq 0 $((num - 1))); do
          if [ "$OPTARG" = ${os_versions[$i]} ]; then
            echo "Building platform: $OPTARG ..."
            build_env ${os_versions[$i]} | tee ./liquidsoap-compile_logs/build_env_${os_versions[$i]}.log
            flag=0
          fi
        done
        if [ $flag = 1 ]; then
          echo "Unsupported Platform from:"
          for j in "${os_versions[@]}"; do
            echo $j
          done
          exit 1
        fi
      fi
      ;;
    c)
      if [ "$OPTARG" = "all" ]; then
        echo "Compiling liquidsoap for all platforms on server..."
        for i in $(seq 0 $((num - 1))); do
          compile_liq ${os_versions[$i]} | tee ./liquidsoap-compile_logs/compile_liq_${os_versions[$i]}.log
        done

      else
        flag=1
        for i in $(seq 0 $((num - 1))); do
          if [ "$OPTARG" = ${os_versions[$i]} ]; then
            echo "Compiling liquidsoap for platform: $OPTARG ..."
            compile_liq ${os_versions[$i]} | tee ./liquidsoap-compile_logs/compile_liq_${os_versions[$i]}.log
            flag=0
          fi
        done
        if [ $flag = 1 ]; then
          echo "Unsupported Platform from:"
          for k in "${os_versions[@]}"; do
            echo $k
          done
          exit 1
        fi
      fi
      ;;
    u)
      sudo_user="$OPTARG"
      echo "sudo_user is set as $sudo_user."
      ;;
    ?)
      showhelp
      ;;
  esac
done