#!/bin/sh

path_to_script () {
  TARGET="$1"
  BASENAME="$(basename "$TARGET")"

  (
    cd -P "$(dirname "$TARGET")"
    if [ -h "$BASENAME" ]
    then
        path_to_script "$(readlink "$BASENAME")"
    else
        echo "$PWD"
    fi
  )

}

goto_script_path() {
  PATH_TO_SCRIPT="$(path_to_script "$0")"
  # Fails to start if the install path contains spaces, so it must be quoted.
  cd "$PATH_TO_SCRIPT"
}

goto_script_path
if ! type python > /dev/null 2>&1; then
    PYTHON="python3"
elif python -V 2>&1| grep -q "Python 3" ;then
    PYTHON="python"
else
    PYTHON="python3"
fi


if [ -f code/version.txt ]; then
    VERSION=`cat code/version.txt`
else
    VERSION="default"
fi


if [ ! -f "code/$VERSION/launcher/start.py" ]; then
    VERSION="default"
fi
REAL_VERSION=`cat code/$VERSION/version.txt`
echo "Start version:$REAL_VERSION"


# launch xx-net service by ignore hungup signal
launchWithNoHungup() {
    nohup ${PYTHON} code/${VERSION}/launcher/start.py $@>/dev/null 2>&1 &
}

# launch xx-net service by hungup signal
launchWithHungup() {
    ${PYTHON} code/${VERSION}/launcher/start.py $@
}


# check command avalibility
has_command() {
    type $1 > /dev/null 2>&1
}

openwrt_setup_env()
{
 echo "It is OpenWrt."
 #TODO: Setup
 # check mount usb disk
 # install python, python-openssl, ipset to usb device
 # opkg --dest usb install python python-pyopenssl
 # setup dns
 # set auto start
 # echo "It is openwrt."
}

# Install Packages
# get operating system name
os_name=`uname -s`
if [ $os_name = 'Linux' ]; then

  PYTHON3="python3/bin/python3"
  if test -f "$PYTHON3"; then
    echo "Linux using embedded python."
    PYTHON="$PYTHON3"
  else
    if ! ${PYTHON} --version 2> /dev/null; then
        echo 'Installing python3 for your system... Please type in your password if requested'
        if has_command zypper; then
            # openSUSE
            sudo zypper in -y python3
        elif has_command apt-get; then
            # Debian or Debian-like
            sudo apt-get install -y python3
        elif has_command dnf; then
            # Fedora
            sudo dnf install -y python3
        elif has_command yum; then
            # RedHat
            sudo yum install -y python3
        elif has_command pacman; then
            # ArchLinux
            sudo pacman -S --noconfirm python3
        elif has_command opkg; then
            # OpenWrt
            echo "install python"
            opkg install python3 python3
        fi
    fi
  fi
elif [ $os_name = 'Darwin' ]; then

  PYTHON3="python3/bin/python3"
  if test -f "$PYTHON3"; then
    echo "Darwin using embedded python."
    PYTHON="$PYTHON3"
  else
    if ! ${PYTHON} -c 'import PyObjCTools, AppKit, SystemConfiguration' 2> /dev/null; then
      sudo pip3 install -U PyObjC Pillow
    fi
  fi

  if [ ! -d "data/launcher/installed" ]; then
    # remove the mask for download file warning
    xattr -c -r *
    touch "data/launcher/installed"
  fi
fi


help()
{
echo "
USAGE:

start -h
  show help.

start
 -allow_remote
   enable remote connect.

 -no_mess_system
   Don't mess the system, include not install CA to browser, not add shortcut to desktop automatically.

 -no_popup
   Don't popup Browser window when start.

 -no_systray
   Don't show systray in task bar.

 -f
   Run in foreground, in Mac will run in background as default.

 -hungup
   start with nohup to run in background.

start set_iptables [interface]
  set iptables for transparent proxy.
  interface   The network interface which will be redirected
              Default is br-lan

start unset_iptables [interface]


"
exit 0
}


set_iptables(){
    if [ "$1" = '' ]; then
      INF="br-lan"
    else
      INF=$1
    fi
    echo "set interface $INF"

    # TODO: check if rule exist

    iptables -t nat -N REDSOCKS
    iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
    iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
    iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
    iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
    iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
    iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
    iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
    iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 8086
    iptables -t nat -A PREROUTING --in-interface $INF -p tcp -j REDSOCKS
    exit 0
}

unset_iptables(){
    if [ "$1" = '' ]; then
      INF="br-lan"
    else
      INF=$1
    fi

    iptables -t nat -D PREROUTING --in-interface $INF -p tcp -j REDSOCKS
    iptables -t nat -D REDSOCKS -d 0.0.0.0/8 -j RETURN
    iptables -t nat -D REDSOCKS -d 10.0.0.0/8 -j RETURN
    iptables -t nat -D REDSOCKS -d 127.0.0.0/8 -j RETURN
    iptables -t nat -D REDSOCKS -d 169.254.0.0/16 -j RETURN
    iptables -t nat -D REDSOCKS -d 172.16.0.0/12 -j RETURN
    iptables -t nat -D REDSOCKS -d 192.168.0.0/16 -j RETURN
    iptables -t nat -D REDSOCKS -d 224.0.0.0/4 -j RETURN
    iptables -t nat -D REDSOCKS -d 240.0.0.0/4 -j RETURN
    iptables -t nat -D REDSOCKS -p tcp -j REDIRECT --to-ports 8086
    iptables -t nat -X REDSOCKS
}


ARGS=$@
if [ $os_name = 'Darwin' ] ; then
  HANGUP='1'
else
  HANGUP='0'
fi

while [ -n "$1" ]; do
case $1 in

-h) help;shift 1;;
-help) help;shift 1;;
--help) help;shift 1;;
-\?) help;shift 1;;

-allow_remote)shift 1;;

-no_mess_system)shift 1;;

-no_popup)shift 1;;

-no_systray)shift 1;;

-f)HANGUP='0'; shift 1;;
-hungup)HANGUP='1';shift 1;;

set_iptables) set_iptables $2;shift 1;;

unset_iptables) unset_iptables $2;exit 1;;

*) echo "unknown option $1."; exit 1;;
esac
done

# Start Application
if [ $HANGUP = '1' ]; then
  echo "Run XX-Net in background."
  launchWithNoHungup $ARGS
else
  launchWithHungup $ARGS
fi

