# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

NC='\033[0m' # No Color

while getopts "f" flag
do
  case "${flag}" in
    f) force=true ;;
  esac
done

proposedVersion=""

updateVersion()
{
  [[ ${1} =~ ^(.*[^0-9])?([0-9]+)$ ]]  && \
    [[ ${#BASH_REMATCH[1]} -gt 0 ]] && \
      printf "%s%0${#BASH_REMATCH[2]}d" "${BASH_REMATCH[1]}" "$((10#${BASH_REMATCH[2]} + 1 ))" || \
      printf "%0${#BASH_REMATCH[2]}d" "$((10#${BASH_REMATCH[2]} + 1))" || \
    printf "${1}"
}

updateNPM()
{
  npmVersionUpdate=$(npm version $proposedVersion --no-commit-hooks --no-git-tag-version)
  npmPublishAction=$(yarn publish --tag=${1} 2>/dev/null) || {
    proposedVersion=$(updateVersion "$proposedVersion")
    echo "Version existante, nouvel essai avec $proposedVersion"
    updateNPM "${1}"
  }
}

echo "Publication du ${IWhite}SDK Admin - ${IBlue}Addio${NC}"

changes=$(git status --porcelain)

if [[ "$changes" != "" ]] && [[ $force != true ]]; then
  echo "${IRed}Attention:${NC} Il y a des changements non commités. ${IYellow}Assurez-vous de faire les commits avant de publier.${NC}"
  exit
fi

yarn build 2>/dev/null || {
  echo "${IRed}La version actuelle ne build pas. Veuillez corriger les erreurs de build et réessayer${NC}"
  exit
}

echo "${IGreen}Build avec succès!${NC}"

actualVersion=$(npm pkg get version | tr -d '"')
branch=$(git branch --show-current)
tag="latest"

echo "Version actuelle: ${IGreen}$actualVersion${NC}"

if [ "$branch" = "master" ]; then
  git pull origin master 2>/dev/null || {
    echo "${IRed}La sync contient des erreurs. Veuillez mettre master à jour avec origin${NC}"
    exit
  }

  if [[ $force != true ]]; then
    read -p "Voulez-vous publier un canary? (Y/n)" isCanary
  else
    isCanary="n"
  fi
else
  isCanary="y"
fi

if [ "$isCanary" = "y" ] || [ "$isCanary" = "Y" ] || [ "$isCanary" = "" ]; then
  if [[ "$actualVersion" == *"canary"* ]]; then
    proposedVersion=$(updateVersion $actualVersion)
  else
    proposedVersion=$(updateVersion "$actualVersion-canary-0")
  fi

  tag="canary"
else
  proposedVersion=${actualVersion%-canary*}
  proposedVersion=$(updateVersion "$proposedVersion")
fi



echo "Version proposée: ${IYellow}$proposedVersion${NC}"
if [[ $force != true ]]; then
  if [ "$branch" = "master" ]; then
    read -p "(Laissez vide si la version proposée convient, sinon entrer la version complète) " newVersion
  else
    read -p "Voulez-vous continuer? (Y/n)" keepGoing
    if [[ "$keepGoing" != "y" ]] && [[ "$keepGoing" != "Y" ]] && [[ "$keepGoing" != "" ]]; then
      echo "${IRed}Annulation de la publication${NC}"
      exit
    fi
  fi
fi

if [ "$newVersion" = "" ]; then
  proposedVersion=$proposedVersion
else
  proposedVersion=$newVersion
fi

npmVersionUpdate=$(npm version $proposedVersion --no-commit-hooks --no-git-tag-version)
npmPublishAction=$(yarn publish --ignore-scripts --tag=$tag 2>/dev/null) || {
  updateNPM "$tag"
}

echo "${IGreen}Version $proposedVersion publiée sur NPM${NC}"

git add . 2>/dev/null || {
  echo "${IRed}Erreur lors de l'enregistrement des changements 'git add .'${NC}"
  exit
}
echo "${IGreen}Commit de version préparé${NC}"

if [ "$isCanary" = "y" ] || [ "$isCanary" = "Y" ] || [ "$isCanary" = "" ]; then
  git commit -m "Canary build: $actualVersion => $proposedVersion" 2>/dev/null || {
    echo "${IRed}Impossible de faire le commit${NC}"
    exit
  }
  echo "${IGreen}Commit de version enregistré: Canary build: $actualVersion => $proposedVersion${NC}"
else
  git commit -m "Latest build: $actualVersion => $proposedVersion" 2>/dev/null || {
    echo "${IRed}Impossible de faire le commit${NC}"
    exit
  }
  echo "${IGreen}Commit de version enregistré: Latest build: $actualVersion => $proposedVersion${NC}"
fi

git push 2>/dev/null || {
  echo "${IRed}Impossible de pousser la branche. Veuillez le faire manuellement${NC}"
  exit
}

echo "${IBlue}Publication terminée!${NC}"