#!/bin/bash

alias ga='  git add'
alias gaa=' git add -A'
alias gau=' git add -u'
alias gba=' git branch -a'
alias gbak='git commit -m "BAK ##$(date +"%Y-%m-%dT%T%z")"'
alias gcc=' git checkout -- .'
alias gd='  git diff'
alias gdt=' git difftool --dir-diff'
alias gex=' rm -Rfv .git ; git init ; git add -A'
alias gfak='git pull ; git add -u ; git commit -m "BAK ##$(date +"%Y-%m-%dT%T%z")" ; git push'
alias gg='  git log --graph --decorate --oneline --no-abbrev-commit'
alias ghr=' ls -1A | grep -vE .git$ | xargs -rI{} rm -Rf '{}' && git checkout -- .'
alias gl='  git log'
alias gpp=' git pull ; git push'
alias gs='  git status'

function gall(){
  if [ "${2}" == "" ]; then
    find . -type d | sort -u | grep -E "\.git$" | sed "s|\/\.git||" | sed "s|^\.|$PWD|" | xargs -I{} bash -c "cd {} ; echo '"'>>>>>>>>>> {}'"' ; ${1}"
  else
    find . -type d | sort -u | grep -E "\.git$" | grep -Ei "${2}" | sed "s|\/\.git||" | sed "s|^\.|$PWD|" | xargs -I{} bash -c "cd {} ; echo '"'>>>>>>>>>> {}'"' ; ${1}"
  fi
}

function gcuab(){
  local  cb=$(git branch --show-current)
  while read -r line; do
    git checkout "${line}"
    git pull

    if [ "${1}" == '--crawler' ]; then
      find -L . -type f -not -path '*/.git*'  |   \
      xargs -rI{} grep -EH '^' '{}' >../$(pwd |   \
      sed -E "s|.*/(.*)|\1_${line}_allCnt\.txt|g")
    fi

  done < <(git branch -a | grep -F 'remotes' | sed -E 's|(^[ ]*remotes/origin/)||g' | cut -d ' ' -f 1)

  git checkout "${cb}"
}

function gbswitch(){
  while read -r line; do
    git checkout "${line}"
    git pull
  done < <(git branch -a | grep -F 'remotes' | sed -E 's|(^[ ]*remotes/origin/)||g' | cut -d ' ' -f 1 | fzf)
}


function gmm(){
  local  cb=$(git branch --show-current)
  local mst=$(git branch | grep -E 'main|master' | tr -s ' '  | cut -d ' ' -f 2)
  git checkout "${mst}"
  git pull
  git checkout "${cb}"
  git merge "${mst}"
}

function gh(){
local opts=$(cat << EOF
add                     :q:  . ______________
add_adoc                :q:  find | grep -E \.adoc$ | xargs -rI{} git add '{}'
branch                  :q:  . ______________
branch_byRepo_local     :q:  echo "${1}" | xargs -rI{} bash -c "git checkout -b '{}' ; git push --set-upstream origin '{}'"
branch_remaster         :q:  cd ../master ; git pull ; git fetch --prune ; cd ../head ; rm -Rf .git ; cp -R ../master/.git .
branch_setupstream      :q:  git push --set-upstream origin $(git branch --show-current)
log                     :q:  . ______________
log_branch              :q:  git --no-pager log --name-status >../$(pwd | sed -E 's|.*/(.*)|\1_git\.log|g')
log_hist                :q:  git clone $(if [ -f 'repo.url' ]; then cat repo.url | grep -Ev '^##.*' ; fi) work ; cd work ; git checkout "${1}" ; git --no-pager log | grep -E "^commit " | sed -E "s|commit ||g" | xargs -rI{} bash -c 'git checkout "{}" ; find -L . -type f -not -path "*/.terraform*" -not -path "*/.git*" | xargs -rI{} file "{}" | grep -E "ASCII|text" | cut -d ":" -f 1 | sort -u --version-sort | xargs -rI@ grep -EH "^" "@" >"../\$(git log "{}" -n 1 --pretty=format:%cd --date=format:"%Y%m%d_%H%M%S")__{}.txt"'
log_hist_nmbr           :q:  git clone $(if [ -f 'repo.url' ]; then cat repo.url | grep -Ev '^##.*' ; fi) work ; cd work ; git checkout "${1}" ; git --no-pager log | grep -E "^commit " | sed -E "s|commit ||g" | xargs -rI{} bash -c 'git checkout "{}" ; find -L . -type f -not -path "*/.terraform*" -not -path "*/.git*" | xargs -rI{} file "{}" | grep -E "ASCII|text" | cut -d ":" -f 1 | sort -u --version-sort | xargs -rI@ grep -EHn "^" "@" >"../\$(git log "{}" -n 1 --pretty=format:%cd --date=format:"%Y%m%d_%H%M%S")__{}.txt"'
meta                    :q:  . ______________
meta_info               :q:  echo -e "GIT_REPO:\t$(git config --get remote.origin.url)" && echo -e "CURRENT BRANCH:\t$(git branch --show-current)" && echo -e "LOG_INFO:\t$(git log --pretty=format:'%H [%cN] %aI %s' -n 1)"
meta_origin             :q:  git config --get remote.origin.url
## purge                :q:  . ______________
purge                   :q:  find -type f | grep -F 'repo.url' | sed -E 's|(.*/).*|\1|g' | xargs -rI{} bash -c 'cd '{}' ; ls -1 | grep -vE "repo\.url|setup\.sh|froozen" | xargs rm -Rf ; git clone \$(if [ -f 'repo.url' ]; then cat repo.url | grep -vE '^#'; fi) head ; cp -R head master ; cd head ; git --no-pager log --name-status >../\$(pwd | sed -E "s|.*/(.*)|\1_git\.log|g") ; find -L . -type f -not -path '*/node_modules*' -not -path '*/.git*' | xargs -rI{} file "{}" | grep ASCII | cut -d ":" -f 1 | sort -u --version-sort | xargs -rI{} grep -EH '^' '{}' >../\$(pwd | sed -E "s|.*/(.*)|\1_allCnt\.txt|g") '
freeze                  :q:  cp -R head froozen
twins                   :q:  . ______________
twins_addRepo           :q:  find -type f | grep -E 'setup\.sh|repo.url' | grep -Ev '/\bhist\b/' | xargs -rI{} git add -f '{}'
twins_purge             :q:  rm -Rf * ; git checkout -- . ; find -type f | grep -F 'repo.url' | sed -E 's|(.*/).*|\1|g' | xargs -rI{} bash -c 'cd '{}' ; ls -1 | grep -vE "repo\.url|setup\.sh" | xargs rm -Rf ; git clone \$(if [ -f 'repo.url' ]; then cat repo.url; fi) head ; cp -R head master ; cd head ; git --no-pager log --name-status >../\$(pwd | sed -E "s|.*/(.*)|\1_git\.log|g") ; find -L . -type f -not -path '*/.terraform*' -not -path '*/.git*' | xargs -rI{} file "{}" | grep ASCII | cut -d ":" -f 1 | sort -u --version-sort | xargs -rI{} grep -EH '^' '{}' >../\$(pwd | sed -E "s|.*/(.*)|\1_allCnt\.txt|g") '
twins_forceAllFiles     :q:  find -L . -type f -not -path '*/.terraform*' -not -path '*/.git*' | xargs -rI{} git add -f '{}'
EOF
)

  local selOpt=$(echo "${opts}" | grep -vE '^##' | nl -i1 -n'rz' -v0 -w3 | sort -ru | fzf)

  if [ "${selOpt}" == "" ]; then
    echo ">>>>>>> nothing selected, cancel ..."
    return
  fi

    mode=$( echo "${selOpt}" | sed  -E 's/(^.*)([ ]*)(:[a-z]?:)([ ]*)(.*$)/\3/g' )
  selOpt=$( echo "${selOpt}" | sed  -E 's/(^.*)([ ]*)(:[a-z]?:)([ ]*)(.*$)/\5/g' )

  case $mode in
    ":q:")
      echo ">>>>>>> ${selOpt}"
      history -s "${selOpt}"
      eval "${selOpt}"
      ;;
    *)
      echo ">>>>>>> ${selOpt} '$@'"
      history -s "${selOpt} '$@'"
      history -s "gh '$@'"
      eval "${selOpt} '$@'"
      ;;
  esac
}

function lrepo(){
  local LCMODULES_DIR="${HOME}/lcmodules_local/head"

  local selOpt=$(find "${LCMODULES_DIR}" -not -path '*/.git*' | grep -E '/HEAD$' | sed -E "s|(${LCMODULES_DIR}/)(.*)/HEAD|\2|g" | sed -E 's|(.*)|  ::  \1|g' | grep -Ei "$(echo "$@" | tr -s ' ' | sed -E 's| |\||g')" | nl -i1 -n'rz' -v0 -w3 | sort -ru | fzf)

  if [ "${selOpt}" == "" ]; then
    echo ">>>>>>> nothing selected, cancel ..."
    return
  fi

  selOpt=$( echo "${selOpt}" | sed  -E 's/(^.*)[ ]*::[ ]*(.*$)/\2/g' )

  read -p "options ('p'lain/'s'ub): " a;

  case $a in
    "s")
      sub=$(echo "${selOpt}" | sed -E "s|.*/(.*)|\1|g")
      mkdir -p "${sub}" ; cd "${sub}"
      ;;
    "p")
      ;;
    *)
      echo "-- Nothing to do --"
      return
      ;;
  esac

  selOpt="git init ; git remote add origin file://${LCMODULES_DIR}/$selOpt ; git fetch ; git reset origin/master ; git checkout master ; git push --set-upstream origin master"

  echo ">>>>>>> ${selOpt}"
  history -s "${selOpt}"
  eval "${selOpt}"
}
