#
# Note: this may contain windows line ended. If you're going to use it in Linux then you'll need
# to remove those with: sed -i 's/\r//' <file>
#

# Handle the fact that this file will be used with multiple OSs
platform=`uname`
if [[ $platform == 'Linux' ]]; then
  alias l='ls -lhg --color'
  alias ll='ls -lahg --color'

  # Arch
  alias flux='redshift'
  alias ipconfig='ip addr'
  alias ifconfig='ip addr'
  alias pi='yaourt -S' # wrapper around Arch Pacman
  alias po='pacman -Qdt' # see orphaned packages
  alias pr='yaourt -R' # giving me trouble now
  alias prr='pacman -Rdd'
  alias pss='sudo pacman -Syu'
  alias pu='yaourt -U'
  # TODO add a trash alias for trash-cli?

elif [[ $platform == 'Darwin' ]]; then
  alias l='ls -laG'
  alias ls='ls -laG'
  alias ll='ls -lG'
  # TODO add a trash alias for trash-cli? or brew install rmtrash

elif [[ "${platform,,}" == *'ming'* ]]; then # convert to lowercase then compare with wildcard
  alias python='winpty python.exe'
  alias python3='winpty python.exe'

  alias l='ls -ahg --color'
  alias ls='ls -ahg --color'
  #alias rm='echo "use trash command instead!"'
  #alias rmr='echo "use trash command instead!"'
  alias trash='remove_windows_file'
  alias tt='remove_windows_file'
  alias cgrep='cgrep.exe'
fi

remove_windows_file() {
    if [ -f "$1" ]; then
        recycle-bin.exe "$1"
    elif [ -d "$1" ]; then
        recycle-bin.exe "$1"
    else
        echo "'$1' does not exist!"
    fi
}

alias c='cd'
alias c-='cd -'
alias cd-='echo "Use c- instead"'
alias ..='cd ../'
alias ...='cd ../..'
alias cd..='cd ..'
alias cd...='cd ../..'
alias cd....='cd ../../..'
alias cd.....='cd ../../../..'

alias aliases='vim ~/.dotfiles/aliases'
alias al='aliases'

# Dev build
b() {
  if [ -f build ]; then ./build $@ ; else test -f build.sh && ./build.sh $@ ; fi
}

# fast dev build
bl() {
  if [ -f build ]; then ./build $@ -fast ; else test -f build.sh && ./build.sh $@ -fast ; fi
}

# Optimized dev build
bb() {
  if [ -f build ]; then ./build -o 1 $@ ; else test -f build.sh && ./build.sh -o 1 $@ ; fi
}

# Production build
bp() {
  if [ -f build ]; then ./build -p p $@ ; else test -f build.sh && ./build.sh -p p $@ ; fi
}

# Profiling build
bf() {
  if [ -f build ]; then ./build -p pf $@ ; else test -f build.sh && ./build.sh -p pf $@ ; fi
}

# GPU profiling build
bg() {
  if [ -f build ]; then ./build -p gpu $@ ; else test -f build.sh && ./build.sh -p gpu $@ ; fi
}

# Run build
r() {
  if [ -f run ]; then ./run $@ ; else test -f run.sh && ./run.sh $@ ; fi
}

# Build then run
br() {
  b $@ ; r
}

alias bd='if [ -f build ]; then ./build -data 1 ; else test -f build.sh && ./build.sh -data 1 ; fi'
alias bbd='if [ -f build ]; then ./build -o 1 -data 1 ; else test -f build.sh && ./build.sh -o 1 -data 1 ; fi'
#alias bl='brew link --overwrite'
#lias bld='brew link --overwrite --dry-run'
alias bower='noglob bower'
alias cr='RUSTFLAGS="$RUSTFLAGS -A unused_variables -A dead_code -A unused_parens" cargo run'
alias crr='cargo run --release'
alias cb='RUSTFLAGS="$RUSTFLAGS -A unused_variables -A dead_code -A unused_parens" cargo build'
alias cbr='cargo build --release'
alias clrtmp='trash ~/tmp/*.bak && trash ~/tmp/*.swp'
alias clrtemp='clrtmp'
alias clipboard='xclip -selection c'
# Cloc alias may be overridden by a private alias
alias cloc='cloc --no3 --by-file-by-lang --skip-win-hidden'
alias cls=clear
alias code='cd ~/code'
alias cpr='cp -r'
alias dc='gdc'
alias dot='cd ~/.dotfiles'
alias pdot='cd ~/.private-dotfiles'
alias duh='du -csh'
alias f='fg'
alias functions='vim ~/.dotfiles/functions'
alias history='fc -l 1'
alias histroy='history'
alias irb='irb --readline -r irb/completion'
alias lcc='lein clean'
alias lca='lein cljsbuild auto dev'
alias ldi='lein deps install'
alias lsd='lein start-dev'
alias moon='curl wttr.in/moon'
alias patch='git format-patch HEAD^ --stdout > patch.diff'
alias reguard='killall -9 ruby ; guard'
alias rb='rbenv'
alias rbg='rbenv gemset active'
alias rbp='cd $RBENV_PATH/versions/$(rbenv version | sed -e "s/ (set.*$//")'
alias rbl='cd $RBENV_PATH/versions/$(rbenv version | sed -e "s/ (set.*$//")/lib/ruby'
alias rc='rclone'
alias rcc='rclone copy'

function reload {
  if [[ $platform == 'Linux' || $platform == 'Darwin' ]]; then
    #source ~/.zshrc
    test -f ~/.aliases && . ~/.aliases
  else
    test -f ~/.aliases && . ~/.aliases
  fi
}

alias restart='sudo shutdown now -r'
alias rl='reload'
alias rmr='rm -r'
alias s='cd ~/.ssh'
alias sc='vim ~/.ssh/config'
alias stream='streamlink --player mpv'
alias shutdown='sudo shutdown now'
alias stk='rlwrap stk-simply'
alias t='tree'
alias tag='ctags -R .'
alias tmp='cd ~/tmp'
alias u='cd ..'
alias v='vim'
alias vi='vim'
alias vh='vagrant halt'
alias vs='vagrant ssh'
alias vu='vagrant up'
alias vimrc='vim ~/.vimrc'
alias weather='curl wttr.in/toronto'

function make_vid_dir_and_cd_into {
    local url="$1"
    local dir_name="$2"

    if [[ $dir_name == "" ]]; then
        # @note If the filename contains symbols that are incompatible with
        # Windows' directory names then add --restrict-filenames to the command.
        dir_name=$(youtube-dl.exe --get-filename -o "%(upload_date)s - %(title)s" $url)
        if [[ $dir_name == "" ]]; then
            return 1
        fi
        dir_name="${dir_name:0:4}-${dir_name:4:2}-${dir_name:6}"
    fi

    echo "Creating directory '$dir_name'"
    mkdir "$dir_name"
    cd "$dir_name"

    error=$?
    if [[ ! $error -eq 0 ]]; then
        echo "Error: failed to create directory. Aborting."
        return 1
    fi

    return 0
}

# Download YouTube videos
function dl_youtube_vid {
    local format="$1"
    local url="$2"
    shift 2
    local opts="$@"
    opts+=" --all-subs --embed-subs"

    make_vid_dir_and_cd_into $url
    if [[ $? -ne 0 ]]; then
        return
    fi

    local name_format=$(youtube-dl.exe --get-filename -o "%(upload_date)s-%(title)s-youtube-%(id)s.%(ext)s" $url)
    name_format="${name_format:0:4}-${name_format:4:2}-${name_format:6}"

    if [[ $format == "" ]]; then
        echo "Downloading default format"
        youtube-dl.exe -o "$name_format" $opts $url
    else
        youtube-dl.exe -f $format -o "$name_format" $opts $url
    fi

    cd ..
}
function dl_youtube_playlist {
    local format="$1"
    local url="$2"
    local dir_name="$3"
    if [[ $dir_name == "" ]]; then
        echo "Please provide a name for the playlist directory"
        return
    fi
    shift 3
    local opts="$@"
    opts+=" --all-subs --embed-subs"

    make_vid_dir_and_cd_into $url $dir_name
    if [[ $? -ne 0 ]]; then
        return
    fi

    echo "Downloading playlist"
    local name_format="v%(playlist_index)s--%(upload_date)s-%(title)s-youtube-%(id)s.%(ext)s"

    if [[ $format == "" ]]; then
        echo "Downloading default format"
        youtube-dl.exe -o "$name_format" $opts $url
    else
        youtube-dl.exe -f $format -o "$name_format" $opts $url
    fi
}
alias yt-download='dl_youtube_vid ""'
alias yt-download-1080='dl_youtube_vid "137+140"'
alias yt-download-720='dl_youtube_vid "136+140"'
alias yt-download-playlist='dl_youtube_playlist ""'
alias yt-download-playlist-1080='dl_youtube_playlist "137+140"'
alias yt-download-playlist-720='dl_youtube_playlist "136+140"'
alias yt-download-audio='youtube-dl.exe -f "140"'

# Download Twitch videos
function dl_twitch_vid {
    local format="$1"
    local url="$2"
    shift 2
    local opts="$@"

    make_vid_dir_and_cd_into $url
    if [[ $? -ne 0 ]]; then
        return
    fi

    local name_format="%(upload_date)s-%(title)s-twitch-%(id)s"
    local video_file=$(youtube-dl.exe --get-filename -o "$name_format.%(ext)s" $url)
    video_file="${video_file:0:4}-${video_file:4:2}-${video_file:6}"
    youtube-dl.exe -f "$format" -o "$video_file" $opts $url

    error=$?
    if [[ $error -eq 0 ]]; then
        # Download Twitch chat transcript
        local chat_file=$(youtube-dl.exe --get-filename -o "$name_format" $url)
        rechat.exe -d $url "$chat_file.json"
        rechat.exe -p "$chat_file.json" "$chat_file.txt" -b -o
        mv "$chat_file.txt" "${chat_file:0:4}-${chat_file:4:2}-${chat_file:6}.txt"
        tt "$chat_file.json"
    else
        echo "Error: Failed to download '$url'"
    fi
    cd ..
}
function dl_twitch_chat {
    local url="$1"

    make_vid_dir_and_cd_into $url
    if [[ $? -ne 0 ]]; then
        return
    fi

    # Download Twitch chat transcript
    local name_format="%(upload_date)s-%(title)s-twitch-%(id)s"
    local chat_file=$(youtube-dl.exe --get-filename -o "$name_format" $url)
    rechat.exe -d $url "$chat_file.json"
    rechat.exe -p "$chat_file.json" "$chat_file.txt" -b -o
    mv "$chat_file.txt" "${chat_file:0:4}-${chat_file:4:2}-${chat_file:6}.txt"
    tt "$chat_file.json"
    cd ..
}
alias tw-download-chat='dl_twitch_chat'
alias tw-dl='youtube-dl.exe -f "1080" -o "%(upload_date)s-%(title)s-twitch-%(id)s.%(ext)s"'
alias tw-dl2='youtube-dl.exe -o "%(upload_date)s-%(title)s-twitch-%(id)s.%(ext)s"'
alias tw-download-custom='dl_twitch_vid '
alias tw-download='dl_twitch_vid "1080p"'
alias tw-download-60='dl_twitch_vid "1080p60"'
alias tw-download-720='dl_twitch_vid "720p-1"'
alias tw-download-720-60='dl_twitch_vid "720p60"'
alias tw-download-4k='dl_twitch_vid "2160p"'

# Git

function gitCmdWrapper {
  # If no args are provided then run `git status`
  if [[ $# > 0 ]]; then
    git $@
  else
    git status
  fi
}

if [[ $platform != 'Darwin' && $platform != 'Linux' ]]; then
  # Fix a weird mingw 'not a valid identifierline' error.
  # Got the fix from https://github.com/Alexpux/MSYS2-packages/issues/735#issuecomment-328938800
  alias git="PATH=/usr/bin git"
fi

alias am='git commit --amend'
alias ama='git commit --amend -C head --author'
alias ams='git commit -S --amend' # signed
alias ammend='echo "use am instead"'
alias amend='echo "use am instead"'
alias g='gitCmdWrapper'
alias ga='git add -A'
alias gap='git add -Ap'
alias gau='git add --update'
alias gb='git branch -v'
alias gbd='git branch -D'
alias gbl='git branch --all'
alias gblm='git blame -wMC'
alias gbm='git branch -m'
alias gbr='git branch -rv'
alias gc='git commit'
alias gcs='git commit -S'
alias gcl='git clone'
alias gcm="git commit -m"
alias gcms="git commit -S -m"
alias gco='git checkout'
alias gco-='git checkout -'
git_checkout_build() {
  git checkout "$1" ; b
}
alias gcoo=git_checkout_build
alias gcob='git checkout -b'
alias gcon='vi .git/config'
alias gcp='git cherry-pick'
alias gcpa='git cherry-pick --abort'
alias gcpc='git cherry-pick --continue'
alias gcps='git cherry-pick -n'
alias gd='git diff'
alias gdc='git diff --cached'
alias gdcc='git diff --cached -w'
alias gdm='git diff master'
alias gds='git diff --stat=160,120'
alias gdw='git diff --color-words'
alias gf='git fetch'
alias gfa='git fetch --all'
alias gfd='git fetch --prune'
alias gfix="git commit --amend -C HEAD"
alias gfixx="git commit --amend -C HEAD ; gp -f"
alias gfixs="git commit -S -a --amend -C HEAD" # signed
alias gfo='git fetch origin'
alias gfu='git fetch up'
alias gfm='git fetch origin master'
alias gfup='git fetch upstream'
alias ggrep='git log --all --oneline | grep '
alias gh="source ~/.githelpers && show_git_head"
alias gla='git lg --all'
alias gl='git lg -30'
alias gll='git lg'
alias gli='git show --pretty="format:" --name-only'
alias glog='git log'
alias glom='gl origin/master'
alias gm='git merge'
alias gmnff='git merge --no-ff'
alias gmff='git merge --ff-only'
alias gmffm='git merge --ff-only master'
alias gmffs='git merge --ff-only --squash'
alias gmtheirs='git merge -Xtheirs'
alias gp='git push'
alias gpa='git push --all && echo "pushing tags..." && git push --tags'
alias gpdf='gpf && gphf'
alias gps='git push staging'
alias gppf='gpf && git push production HEAD:production -f'
alias gpu='git push --set-upstream origin HEAD'
alias gpff='git pull --ff-only'
alias gplup='git pull upstream master'
alias gpo='git push origin'
alias gpom='git push origin master'
alias gpr='git pull --rebase'
alias gpt='git push --tags'
alias gr='git reset'
alias gr1='git reset HEAD^1'
alias grb='git rebase'
alias grba='git rebase --abort'
alias grbc='git rebase --continue'
alias grbs='git rebase --skip'
alias grbi='git rebase -i --autostash'
alias grbm='git rebase master --autostash'
alias grbmi='git rebase master -i --autostash'
alias grbo='git fetch origin master && git rebase origin/master'
alias grboi='git fetch origin master && git rebase origin/master -i'
alias grbum='git fetch upstream master && git rebase upstream/master'
alias gre='git remote'
alias grea='git remote add'
alias gremo='git remote remove origin; git remote add origin'
alias greao='git remote add origin'
alias gred='git remote remove'
alias gref='git reflog --format="%C(auto)%h %<|(17)%gd %C(cyan)%ci%C(reset) [%gs] %C(yellow)(%s)%C(reset)"'
alias grev='git remote -v'
alias grm='git rm'
alias grmr='git rm -r'
alias grp='git reset -p'
alias gsnapshot='git stash save "snapshot: $(date)" && git stash apply "stash@{0}"'
alias gsh='git show'
alias gshh='git show -w'
alias gs='git stash'
alias gsk='git stash -k -u'
alias gssk='git stash save -k -u'
alias gss='git stash save'
alias gsd='git stash drop'
alias gsdl='git stash drop stash@{0}'
alias gsl='git stash list'
alias gsi='git stash -p'
alias gsp='git stash pop'
alias gsp0='git stash pop stash@{0}'
alias gsp1='git stash pop stash@{1}'
alias gsp2='git stash pop stash@{2}'
alias gsp3='git stash pop stash@{3}'
alias gsp4='git stash pop stash@{4}'
alias gsp5='git stash pop stash@{6}'
alias gsp6='git stash pop stash@{7}'
alias gt='git tag'
alias gta='git tag -a'
alias gtd='git tag -d'
alias gtl='git tag -l'
alias gx='git reset --hard'
alias gxx='git reset --hard HEAD~1'
alias gxom='git reset --hard origin/master'
alias gstats='echo "Total commits: $(git rev-list HEAD --count)"; echo "\nAuthor breakdown:"; git shortlog | grep -E "^[^ ]"'
alias gwip="git add . && git commit -m \"WIP\""

# Haxe
alias flow='haxelib run flow'
alias snowfall='haxelib run snowfall'

# Other aliases
alias pal='vim ~/.private-dotfiles/aliases'
test -f ~/.private-dotfiles/aliases && . ~/.private-dotfiles/aliases

alias cmake-gen='cmake -D CMAKE_CXX_COMPILER="/Library/Developer/CommandLineTools/usr/bin/c++" CMAKE_C_COMPILER="/Library/Developer/CommandLineTools/usr/bin/cc" ..'