#!/bin/bash

# set -e

# @TODO fix sudo in docker
command -v sudo >>/dev/null 2>&1
if [ $? -ne 0 ]; then
  sudo() {
    eval "$@"
  }
  chown() {
    echo "ignore chown" >>/dev/null 2>&1
  }
  tput() {
    echo "ignore tput" >>/dev/null 2>&1
  }

  export -f sudo
  export -f chown
  export -f tput
fi

IS_PM_SOURCE_UPDATED=false
CHOWN_USER=$CHOWN_USER

# fix env CHOWN_USER not found
if [ -z "$CHOWN_USER" ]; then
  # export CHOWN_USER=root
  CHOWN_USER=$(id -u)
fi

has_command() {
  command -v $1 >>/dev/null 2>&1
  if [ "$?" = "0" ]; then
    echo "true"
  else
    echo "false"
  fi
}

depends() {
  local cli=$1

  if [ "$(has_command $cli)" = "false" ]; then
    echo "[dependencies] install $cli ..."

    # macos
    if [ "$(uname -s)" = "Darwin" ]; then
      if [ "$(has_command brew)" = "false" ]; then
        if [ "$GITHUB_ACTIONS" = "true" ]; then
          echo "in GitHub Actions, not necessary to change homebrew mirror"
        else
          # mirror: https://github.com/eryajf/Thanks-Mirror#homebrew
          export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
          export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"
          export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
        fi

        sudo curl -o- https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | bash
      fi

      brew install -f $cli
      if [ "$?" != "0" ]; then
        exit 1
      fi
      return
    fi

    # ubuntu
    if [ "$(has_command apt)" = "true" ]; then
      if [ "$IS_PM_SOURCE_UPDATED" = "false" ]; then
        IS_PM_SOURCE_UPDATED=true
        sudo apt update -y
      fi

      sudo apt install -y $cli
      if [ "$?" != "0" ]; then
        exit 1
      fi
      return
    fi

    # debian
    if [ "$(has_command apt-get)" = "true" ]; then
      if [ "$IS_PM_SOURCE_UPDATED" = "false" ]; then
        IS_PM_SOURCE_UPDATED=true
        sudo apt-get update -y
      fi

      sudo apt-get install -y $cli
      if [ "$?" != "0" ]; then
        exit 1
      fi
      return
    fi

    # centos
    if [ "$(has_command yum)" = "true" ]; then
      if [ "$IS_PM_SOURCE_UPDATED" = "false" ]; then
        IS_PM_SOURCE_UPDATED=true
        sudo yum update -y
      fi

      sudo yum install -y $cli
      if [ "$?" != "0" ]; then
        exit 1
      fi
      return
    fi

    # alpine
    if [ "$(has_command apk)" = "true" ]; then
      if [ "$IS_PM_SOURCE_UPDATED" = "false" ]; then
        IS_PM_SOURCE_UPDATED=true
        sudo apk update
      fi

      sudo apk add $cli
      if [ "$?" != "0" ]; then
        exit 1
      fi
      return
    fi

    # federa
    if [ "$(has_command dnf)" = "true" ]; then
      sudo dnf install -y $cli
      if [ "$?" != "0" ]; then
        exit 1
      fi
      return
    fi

    # archlinux
    if [ "$(has_command pacman)" = "true" ]; then
      sudo pacman -Syu --noconfirm $cli
      if [ "$?" != "0" ]; then
        exit 1
      fi
      return
    fi

    echo "unkown linux package manager: $(uname -a)"
    exit 1
  fi
}

set -e

export ZMICRO_HOME_PARENT_DIR=${ZMICRO_HOME_PARENT_DIR:-"/usr/local/lib"}
export ZMICRO_HOME=${ZMICRO_HOME:-"${ZMICRO_HOME_PARENT_DIR}/zmicro"}

export ZMICRO_USER_LOCAL_BIN_DIR=${ZMICRO_USER_LOCAL_BIN_DIR:-"/usr/local/bin"}

export ZMICRO_GLOBAL_RC_DIR=${ZMICRO_GLOBAL_RC_DIR:-"/etc/zmicro"}
export ZMICRO_GLOBAL_RC=$ZMICRO_GLOBAL_RC_DIR/.zmicrorc
export ZMICRO_LOG_DIR=${ZMICRO_LOG_DIR:-"/var/log/zmicro"}
export ZMICRO_LOCAL_BIN=$ZMICRO_USER_LOCAL_BIN_DIR/zmicro
export ZMICRO_ROOT_BIN_DIR=${ZMICRO_ROOT_BIN_DIR:-"/bin"}

export OLD_ZMICRO_HOME=$HOME/.zmicro
export OLD_ZMICRO_HOME_BAK=${ZMICRO_HOME}.bak

if [ ! -d "$ZMICRO_USER_LOCAL_BIN_DIR" ]; then
  sudo mkdir -p $ZMICRO_USER_LOCAL_BIN_DIR
fi

# @TO_REMOVE
if [ ! -d "$ZMICRO_HOME_PARENT_DIR" ]; then
  sudo mkdir -p $ZMICRO_HOME_PARENT_DIR
fi

# Backup
if [ -d "$OLD_ZMICRO_HOME" ]; then
  sudo mv $OLD_ZMICRO_HOME $OLD_ZMICRO_HOME_BAK
fi

depends bash
depends curl
# depends wget
depends git

# Create
if [ ! -d "$ZMICRO_HOME" ]; then
  sudo git clone https://github.com/zcorky/zmicro.git $ZMICRO_HOME
  if [ "$?" != "0" ]; then
    echo "error: failed to install zmicro (1)"
    exit 1
  fi
fi

# Permission
if [ ! -w "$ZMICRO_HOME" ]; then
  sudo chown -R $CHOWN_USER $ZMICRO_HOME
fi

# Logs
# if [ ! -w $ZMICRO_LOG_DIR ]; then
# @TODO ensure log permissions
if [ ! -d $ZMICRO_LOG_DIR ]; then
  sudo mkdir -p $ZMICRO_LOG_DIR
fi
if [ ! -w $ZMICRO_LOG_DIR ]; then
  sudo chmod -R 777 $ZMICRO_LOG_DIR
fi
# fi

# GLOBAL RC
if [ ! -d "$ZMICRO_GLOBAL_RC_DIR" ]; then
  sudo mkdir -p $ZMICRO_GLOBAL_RC_DIR
fi
if [ ! -w "$ZMICRO_GLOBAL_RC_DIR" ]; then
  sudo chown -R $CHOWN_USER $ZMICRO_GLOBAL_RC_DIR
fi
if [ ! -f "$ZMICRO_GLOBAL_RC" ]; then
  sudo touch $ZMICRO_GLOBAL_RC
fi
if [ ! -w "$ZMICRO_GLOBAL_RC" ]; then
  sudo chown $CHOWN_USER $ZMICRO_GLOBAL_RC
fi

# Bin
if [ -f $ZMICRO_LOCAL_BIN ]; then
  sudo rm -f $ZMICRO_LOCAL_BIN
fi
sudo ln -s $ZMICRO_HOME/bin/zmicro $ZMICRO_LOCAL_BIN

if [ "$(uname -s)" = "Darwin" ]; then
  export ZMICRO_ROOT_BIN_DIR=/usr/local/bin
fi

# MacOS cannot ln to /bin
if [ ! -d "$ZMICRO_ROOT_BIN_DIR" ]; then
  sudo mkdir -p $ZMICRO_ROOT_BIN_DIR
fi

sudo ln -sf $ZMICRO_HOME/bin/zmicro $ZMICRO_ROOT_BIN_DIR/zmicro >>/dev/null # 2>&1

# . $ZMICRO_HOME/config/config

# Init
zmicro initialize $@

echo "Congratualation. Zmicro install successfully"
echo "Now you can see play with zmicro."

# echo ""
# echo "First install, you should source profile:"
# echo "  bash: source \$HOME/.bashrc"
# echo "  zsh: source \$HOME/.zshrc"
# echo "Then run update:"
# echo "  zmicro update"
# echo ""