#!/usr/bin/env bash
# -*- sh-basic-offset: 2 -*-

##
# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##

#PATH
#PYTHONPATH

daemonize="";
errorlogenabled="";
username="";
groupname="";
configfile="";
twistdpath="$(type -p twistd)";
plugin_name="caldav";
service_type="";
profile="";
twistd_reactor="";
child_reactor=""
extra="";

py_version ()
{
  local python="$1"; shift
  echo "$("${python}" -c "from distutils.sysconfig import get_python_version; print get_python_version()")";
}

try_python ()
{
  local python="$1"; shift

  if [ -z "${python}" ]; then return 1; fi;

  if ! type "${python}" > /dev/null 2>&1; then return 1; fi;
  local py_version="$(py_version "${python}")";
  if [ "${py_version/./}" -lt "24" ]; then return 1; fi;

  return 0;
}

for v in "2.7" "2.6" "2.5" ""; do
  for p in                                                              \
    "${PYTHON:=}"                                                       \
    "python${v}"                                                        \
    "/usr/local/bin/python${v}"                                         \
    "/usr/local/python/bin/python${v}"                                  \
    "/usr/local/python${v}/bin/python${v}"                              \
    "/opt/bin/python${v}"                                               \
    "/opt/python/bin/python${v}"                                        \
    "/opt/python${v}/bin/python${v}"                                    \
    "/Library/Frameworks/Python.framework/Versions/${v}/bin/python"     \
    "/opt/local/bin/python${v}"                                         \
    "/sw/bin/python${v}"                                                \
    ;
  do
    if try_python "${p}"; then python="${p}"; break; fi;
  done;
  if [ -n "${python:-}" ]; then break; fi;
done;

if [ -z "${python:-}" ]; then
  echo "No suitable python found.";
  exit 1;
fi;

usage ()
{
    program="$(basename "$0")";

    if [ "${1--}" != "-" ]; then echo "$@"; echo; fi;

    echo "Usage: ${program} [-hX] [-u username] [-g groupname] [-T twistd] [-t type] [-f caldavd.plist] [-p statsfile]";
    echo "Options:";
    echo "        -h Print this help and exit";
    echo "        -X Do not daemonize";
    echo "        -L Do not log errors to file; instead use stdout";
    echo "        -u User name to run as";
    echo "        -g Group name to run as";
    echo "        -f Configuration file to read";
    echo "        -T Path to twistd binary";
    echo "        -t Process type (Master, Slave or Combined)";
    echo "        -p Path to the desired pstats file.";
    echo "        -R The Twisted Reactor to run [${reactor}]";

    if [ "${1-}" == "-" ]; then return 0; fi;
    exit 64;
}

while getopts 'hXLu:g:f:T:P:t:p:R:o:' option; do
    case "${option}" in
        '?') usage; ;;
        'h') usage -; exit 0; ;;
        'X') daemonize="-n"; ;;
        'L') errorlogenabled="-o ErrorLogEnabled=False"; ;;
        'f') configfile="-f ${OPTARG}"; ;;
        'T') twistdpath="${OPTARG}"; ;;
        'u') username="-u ${OPTARG}"; ;;
        'g') groupname="-g ${OPTARG}"; ;;
        'P') plugin_name="${OPTARG}"; ;;
        't') service_type="-o ProcessType=${OPTARG}"; ;;
        'p') twistd_profile="--profiler=cprofile-cpu --profile=${OPTARG}/master.pstats --savestats";
             profile="-o Profiling/Enabled=True -o Profiling/BaseDirectory=${OPTARG}"; ;;
        'R') twistd_reactor="--reactor=${OPTARG}"; child_reactor="-o Twisted/reactor=${OPTARG}"; ;;
        'o') extra="${extra} -o ${OPTARG}"; ;;
    esac;
done;

shift $((${OPTIND} - 1));

if [ $# != 0 ]; then usage "Unrecognized arguments:" "$@"; fi;

export PYTHONHASHSEED=random

export PYTHONPATH

exec "${python}" "${twistdpath}" ${twistd_profile} ${twistd_reactor} ${daemonize} ${username} ${groupname} "${plugin_name}" ${configfile} ${service_type} ${errorlogenabled} ${profile} ${child_reactor} ${extra};
