#!/usr/bin/env bash

set -euo pipefail

_SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)

#COLORS
__CDEF="\033[0m"      # default color
__b_CCIN="\033[1;36m" # bold info color
__b_CGSC="\033[1;32m" # bold success color
__b_CRER="\033[1;31m" # bold error color
__b_CWAR="\033[1;33m" # bold warning color

# echo like with flag type and display message colors
__prompt() {
  case ${1} in
  "-s" | "--success")
    echo -e "${__b_CGSC}${2}${__CDEF}"
    ;; # print success message
  "-e" | "--error")
    echo -e "${__b_CRER}${2}${__CDEF}"
    ;; # print error message
  "-w" | "--warning")
    echo -e "${__b_CWAR}${2}${__CDEF}"
    ;; # print warning message
  "-i" | "--info")
    echo -e "${__b_CCIN}${2}${__CDEF}"
    ;; # print info message
  *)
    echo -e "$@"
    ;;
  esac
}

extract-reciters() {
  __prompt -s "-- generating reciters ts file"
  local __tsfile=$_SCRIPT_DIR/generated/reciters.ts
  local __xmlfile=$_SCRIPT_DIR/../../resources/reciters.xml

  mapfile -t __reciters_names <<<"$(grep -oE 'display="([^"]+)"' "${__xmlfile}" | cut -d'"' -f2)"

  printf "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n" >"${__tsfile}"
  printf "<context>\n\t<name>MainWindow</name>" >>"${__tsfile}"

  for n in "${__reciters_names[@]}"; do
    __prompt -i "-- adding '${n}'"
    printf "\n\t<message>\n\t\t<location filename=\"../main.cpp\"/>\n\t\t<source>%s</source>\n\t\t<translation type=\"unfinished\"></translation>\n\t</message>" "$n" >>"${__tsfile}"
  done

  printf "\n</context>\n</TS>" >>"${__tsfile}"
  echo "-- extracted ${#__reciters_names[@]} reciters"
}

extract-tafasir() {
  __prompt -s "-- generating tafasir ts file"
  local __tsfile=$_SCRIPT_DIR/generated/tafasir.ts
  local __xmlfile=$_SCRIPT_DIR/../../resources/files.xml

  mapfile -t __tafasir_names <<<"$(grep -oE 'tafsir.*name="([^"]+)"' "${__xmlfile}" | cut -d'"' -f6)"

  printf "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n" >"$__tsfile"
  printf "<context>\n\t<name>MainWindow</name>" >>"$__tsfile"

  for n in "${__tafasir_names[@]}"; do
    __prompt -i "-- adding '${n}'"
    printf "\n\t<message>\n\t\t<location filename=\"../main.cpp\"/>\n\t\t<source>%s</source>\n\t\t<translation type=\"unfinished\"></translation>\n\t</message>" "$n" >>"$__tsfile"
  done

  printf "\n</context>\n</TS>" >>"$__tsfile"
  echo "-- extracted ${#__tafasir_names[@]} tafasir"
}

extract-shortcuts() {
  __prompt -s "-- generating shortcuts ts file"
  local __tsfile=$_SCRIPT_DIR/generated/shortcuts.ts
  local __xmlfile=$_SCRIPT_DIR/../../resources/shortcuts.xml

  mapfile -t __shortcuts_desc <<<"$(grep -oE 'description="[^"]+"' "${__xmlfile}" | cut -d'"' -f2)"

  printf "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n" >"$__tsfile"
  printf "<context>\n\t<name>SettingsDialog</name>" >>"$__tsfile"

  for n in "${__shortcuts_desc[@]}"; do
    __prompt -i "-- adding '${n}'"
    printf "\n\t<message>\n\t\t<location filename=\"../main.cpp\"/>\n\t\t<source>%s</source>\n\t\t<translation type=\"unfinished\"></translation>\n\t</message>" "$n" >>"$__tsfile"
  done

  printf "\n</context>\n</TS>" >>"$__tsfile"
  echo "-- extracted ${#__shortcuts_desc[@]} shortcuts"
}

extract-source-strings() {
  __prompt -s "-- generating sources ts file"
  lupdate -recursive -no-obsolete "$_SCRIPT_DIR/../../src" -ts "$_SCRIPT_DIR/generated/sources.ts"
}

update-template() {
  __prompt -s "-- updating template ts file"
  local templatefile="$_SCRIPT_DIR/template.ts"
  declare -a generated
  for f in "$_SCRIPT_DIR/generated/"*; do
    generated=("${generated[@]}" "$f")
  done
  lconvert -i "${generated[@]}" -no-obsolete -o "${templatefile}"
}

_main() {
  extract-reciters
  extract-tafasir
  extract-shortcuts
  extract-source-strings
  update-template
}

_main
