#This script prepares files to send an email and update code
update_code() {
  coop=$1
  instance=$2
  repo=$3
  now=$4
  send_mails=$5

  ci_dir="/home/django/third-party/scripts/src"
  ci_data_dir="/home/django/third-party/scripts/data"


  ###EARLY CHECKS###

  if [[ ${repo} == "third-party" ]]; then
    user="django"
    service="django"
  elif [[ ${repo} == "Odoo" ]]; then
    user="odoo"
    service="odoo"
  else
    echo "Incorrect repo name : ${repo}"
    if ${send_mails}; then
      python3 "${ci_dir}/send_error_mail.py" "${coop} ${instance} ${repo} : incorrect repo name"
    fi
    exit 1
  fi

  cd /home/${user}/${repo}
  su ${user} -c "git fetch --all"

  branch_found_str=$( su ${user} -c "git ls-remote origin ${coop}_prod" ) #seems that git ls-remote is not "failing" so we need to check output
  if [ -z "${branch_found_str}" ]; then
    #branch prod does not exist, cannot go on
    echo "${coop} ${instance} ${repo}: branch ${coop}_prod does not exist"
    if ${send_mails}; then
      python3 "${ci_dir}/send_error_mail.py" "${coop} ${instance} ${repo} : branch ${coop}_prod does not exist"
    fi
    exit 1
  fi


  ###COMPARE BRANCHES AND DECIDE IF WE NEED TO CREATE A FILE CONTAINING NEW COMMITS###

  #new_commits="$( git log origin/${coop}_prod...origin/dev_cooperatic --no-merges --oneline )" (old version)

  #Let's break down the new big line below :
  #origin/${coop}_prod...origin/dev_cooperatic : we look for difference between develop branch and prod branch
  #--pretty=format:'%s' : get rid of commit id
  #the big grep+sed group : discard lines not maching pattern "merge [0-9]\+-... into dev_cooperatic" and only keep the [0-9]\+-.... part with a link to redmine
  new_commits="$( git log origin/${coop}_prod...origin/dev_cooperatic --merges --oneline --pretty=format:'%s' | grep "into 'dev_cooperatic'" | sed "s/Merge branch '//g" | sed "s/' into 'dev_cooperatic'//g" | grep "^[0-9]\+" | sed -E 's/(^[0-9]+)/\<a href=\"https\:\/\/redmine.coopdev.fr\/issues\/\1\"\>\1\<\/a\>/g' )"
  if [ -z "${new_commits}" ]; then
    echo "${coop} ${instance} ${repo} : no new commits"
    #As there are no new commits in prod, we don't want to send email for this repo.
    #To indicate that, we do not create any ci_diff file at current time.
  else
    if ! test -f "${ci_data_dir}/ci_diff_${repo}_last.txt"; then
      touch "${ci_data_dir}/ci_diff_${repo}_last.txt"
    fi

    echo "${new_commits}" > "${ci_data_dir}/ci_diff_${repo}_${now}.txt"

    #See if commit difference is the same than last time
    if cmp "${ci_data_dir}/ci_diff_${repo}_last.txt" "${ci_data_dir}/ci_diff_${repo}_${now}.txt"; then
      #As there are no new commits in prod, we don't want to send email for this repo.
      #To indicate that, we delete just created ci_diff file at current time.
      rm "${ci_data_dir}/ci_diff_${repo}_${now}.txt"
      echo "${coop} ${instance} ${repo} : ci_diff_${repo} files are identical"
    else
      #We have created new ci_diff.
      #Replace old ci_diff_last by new one
      rm "${ci_data_dir}/ci_diff_${repo}_last.txt"
      cp "${ci_data_dir}/ci_diff_${repo}_${now}.txt" "${ci_data_dir}/ci_diff_${repo}_last.txt"
    fi
  fi


  ###UPDATE CODE (DO IT ANYWAY AS IT IS ONLY USED ON PREPROD FOR NOW)###

  #If repo is third-party, make sure config file exists as we need it later
  if [[ ${repo} == "third-party" ]]; then
    if ! test -f "coops_configurations/config_${coop}.py"; then
      echo "${coop} ${instance} ${repo}: coops_configurations/config_${coop}.py does not exists"
      if ${send_mails}; then
        python3 "${ci_dir}/send_error_mail.py" "${coop} ${instance} ${repo} : coops_configurations/config_${coop}.py does not exists"
      fi
      exit 1
    fi
  fi

  /etc/init.d/${service} stop #TODO : on prod, make sure some changes are required before stopping / restarting service

  #Stash mess, then checkout proper branch and pull
  #Stash + checkout + pull seems a good way to get rid of mess without deleting it
  su ${user} -c "git stash"
  #maybe some user changed branch so we need to get back on dev_cooperatic
  if ! su ${user} -c "git checkout dev_cooperatic"; then
    #handling cases when git checkout branch fails
    #We can not continue but we have stopped service already, let's restart it before exiting
    /etc/init.d/${service} start
    echo "${coop} ${instance} ${repo}: could not git checkout dev_cooperatic"
    if ${send_mails}; then
      python3 "${ci_dir}/send_error_mail.py" "${coop} ${instance} ${repo} : could not checkout dev_cooperatic"
    fi
    exit 1
  fi

  if [[ ${repo} == "Odoo" ]]; then
    echo "git diff --name-only dev_cooperatic..origin/dev_cooperatic"
    updated_filepaths="$( git diff --name-only dev_cooperatic..origin/dev_cooperatic )"
    echo "${updated_filepaths}"
  fi

  if ! su ${user} -c "git pull"; then
    #handling cases when git pull branch fails
    #We can not continue but we have stopped service already, let's restart it before exiting
    /etc/init.d/${service} start
    echo "${coop} ${instance} ${repo}: could not git pull"
    if ${send_mails}; then
      python3 "${ci_dir}/send_error_mail.py" "${coop} ${instance} ${repo} : could not git pull"
    fi
    exit 1
  fi

  if [[ ${repo} == "third-party" ]]; then
    #Replace config file by proper one only if required
    if ! cmp "outils/config.py" "coops_configurations/config_${coop}.py"; then
      #Config files are different, go for it
      mv "outils/config.py" "${ci_data_dir}/ci_old_cfg_file_${now}.py"
      cp "coops_configurations/config_${coop}.py" "outils/config.py"
    else
      echo "config files are identical"
    fi
    /etc/init.d/django start
  else
    #oop on updated_filenames, for each filename, look for the directory of __openerp__.py file
    #if found, just store the parent directory
    SAVEIFS=$IFS
    IFS=$'\n'
    if [[ ${updated_filepaths} == "" ]]; then
      updated_filepaths_array=()
    else
      read -rd '' -a updated_filepaths_array <<<"${updated_filepaths}"
    fi

    IFS='/'
    l=${#updated_filepaths_array[@]}

    declare -A modules #modules to update
    modules_str=""

    for (( i=0; i<l; i++ ));
    do
      read -rd '' -a one_path_array <<<"${updated_filepaths_array[$i]}"
      j=0
      accu_path="${one_path_array[0]}"
      pathlen=${#one_path_array[@]}
      while [[ $j -lt ${pathlen} ]] && ! test -f "${accu_path}/__openerp__.py"; do
        ((j++))
        accu_path="${accu_path}/${one_path_array[j]}"
      done
      #Update key of modules if (we have found openerp.py (j<path) + module has not been added already),
      #so that we do not add twice same module in modules_str
      #and add module in modules_str
      if [[ $j -lt ${pathlen} ]] && [[ ! -v modules["${one_path_array[$j]}"] ]]; then
        modules["${one_path_array[$j]}"]=
        if [[ ${modules_str} == "" ]]; then
          modules_str="${one_path_array[$j]}"
        else
          modules_str="${modules_str},${one_path_array[$j]}"
        fi
      fi
    done

    IFS=$SAVEIFS

    echo "${modules_str}"

    restart_odoo_cmd="/home/odoo/Odoo/odoo/odoo.py -c /home/odoo/odoo-server.conf"
    if [[ -n "${modules_str}" ]]; then
      echo "restart odoo service with module update"
      su odoo -c "${restart_odoo_cmd} -u${modules_str} --stop-after-init" #TODO : make sure this is working fine
    fi
  fi

  echo "Starting ${service} service"
  /etc/init.d/${service} start
}