#!/bin/bash
#
# Copyright (C) 2002-2021  AfterLogic Corp. (www.afterlogic.com)
# Distributed under the terms of the license described in LICENSE
#

. ./messages

# Tracing installition steps
function trace_step {
    echo -n "$1... "
    $2
    if [ $? -gt 0 ]; then
	echo "$FAILED_MSG"
	exit $?
    fi
    
    echo "$DONE_MSG"
    return $?
}

function print_platform_usage {
    return 0
}

function print_usage {
    echo -e $USAGE
    print_platform_usage
}

function parse_command_line {
    local res=0
    while getopts ":p:a:t:" opt ; do
	case "$opt" in
	    "p")
		PLATFORM="$OPTARG"
		;;
	    "a")
		ACTION="$OPTARG"
		;;
	    "t")
		VERSION_TYPE="$OPTARG"
		if [ $VERSION_TYPE == "lite" ]; then
		    SOURCE="http://www.afterlogic.org/download/webmail_php.zip"
		    
		fi
		if [ $VERSION_TYPE == "pro" ]; then
		    SOURCE="http://www.afterlogic.com/download/webmail-pro-php.zip"
		fi
		;;
	    "?")
		echo "$UNKNOWN_OPTION_MSG: $OPTARG"
		res=1
		;;
	    ":")
		echo "$NO_OPTION_VALUE_MSG: $OPTARG"
		res=1
		;;
	    *)
		echo "$UNKNOWN_ERROR_MSG"
		res=1
		;;
	esac
    done
    return $res
}


function setup_platform {
    # Try to detect platform automatically
    
    local DA_SERVICE="/etc/init.d/directadmin"
    local DA_SYSTEMD="/etc/systemd/system/directadmin.service"
    if [ -f $DA_SERVICE ] || [ -f $DA_SYSTEMD ] && [ -z $PLATFORM ]; then
	PLATFORM="DirectAdmin"
    fi
    
    local CPANEL_SERVICE="/etc/init.d/cpanel"
    local CPANEL_SYSTEMD="/etc/systemd/system/cpanel.service"
    if [ -f $CPANEL_SERVICE ] || [ -f $CPANEL_SYSTEMD ] && [ -z $PLATFORM ]; then
	PLATFORM="cPanel"
    fi
    
    
    # Include platform functions
    
    if [ -z "$PLATFORM" ]; then
	echo "$UNKNOWN_PLATFORM_MSG"
	return 1
    fi
    
    if [ ! -f "./$PLATFORM/functions" ]; then
	echo "$NO_PLATFORM_INSTRUCTIONS: $PLATFORM"
	return 1
    fi
    
    echo "$SELECTED_PLATFORM_MSG: $PLATFORM"
    . ./$PLATFORM/functions
    
    return 0
}

function require {
    for var in $@ ; do
	if $(eval [ -z \$$var ] ) ; then
	    echo "$REQUIRED_VAR_MSG: \$$var"
	    return 1
	fi
    done
    return 0 ;
}

function check_php_version {
    local PHP="/usr/local/cpanel/3rdparty/bin/php"
    
    local PHP_MIN_VERSION="5.6.0"
    local PHP_VERSION=`$PHP --version | grep PHP |grep -v "Copyright" | awk '{print $2}'`

    $PHP ./configure "check_version" $PHP_VERSION $PHP_MIN_VERSION
    if [ $? -lt 0 ]; then
	echo "$UNSUPPORTED_PHP_VERSION_MSG: $PHP_VERSION ($PHP_MIN_VERSION)"
	return 1
    fi
    
    return 0
}

function check_requirements {
    check_php_version
    if [ $? -gt 0 ]; then
	return 1
    fi
    
    return 0
}

function copy_source {
    local SRC=$1
    local DST=$2
    local DOWNLOADER="wget -O $DST"
    
    # TODO: SRC is URL or FILE
    
    `$DOWNLOADER $SRC`
    
    return $?
}

function download_and_extract {
    local COPY_FLAG=$4
    local SOURCE_URL=$1
    local WORK_DIR=$2

    local TMP_DIR=/tmp/al_webmail
    local PACKAGE=`basename $SOURCE_URL`
    local PACKAGE_PATH=$TMP_DIR/$PACKAGE
    local APPUSER=root
    local PAR_DIR="$(dirname "$WORK_DIR")"

    # Prepare temporary directories
    rm -rf $TMP_DIR &> /dev/null
    mkdir -p $TMP_DIR

    if [ $COPY_FLAG -gt 0 ]; then
        local TMP_DIR_2=/tmp/al_webmail_data
	rm -rf $TMP_DIR_2 &> /dev/null
        mkdir -p $TMP_DIR_2
    fi

    # Downloading source
    echo "$DOWNLOAD_PACKAGE_MSG $PACKAGE"
    copy_source $SOURCE_URL $PACKAGE_PATH
    if [ $? -gt 0 ]; then
	return 1
    fi

    # Extracting package
    echo "$EXTRACTING_PACKAGE_MSG $PACKAGE"
    unzip $PACKAGE_PATH -d $TMP_DIR 1>/dev/null

    # Patching
    patch_package "$TMP_DIR"

    if [ ! -d $WORK_DIR ]; then
	mkdir -p $WORK_DIR
    fi
    if [ $? -gt 0 ]; then
	return 1
    fi

    if [ $COPY_FLAG -gt 0 ]; then
	if [ -d $WORK_DIR/data ]; then
    	    mv $WORK_DIR/data $TMP_DIR_2/        
	fi
	if [ -d $PAR_DIR/data ]; then
	    mv $PAR_DIR/data $TMP_DIR_2/
	fi
    fi

    rm -rf $PAR_DIR
    mkdir -p $WORK_DIR

    cp -Rf $TMP_DIR/* $WORK_DIR/
    if [ $? -gt 0 ]; then
	return 1
    fi

    if [ $COPY_FLAG -gt 0 ]; then
        rm -rf $WORK_DIR/data &> /dev/null
        mv -f $TMP_DIR_2/data $WORK_DIR/
    fi

    rm -rf $WORK_DIR/data/cache
    mkdir -p $WORK_DIR/data/cache

    mv $WORK_DIR/cpanel/index.php $PAR_DIR
    echo "$SETUP_PERMISSIONS_MSG"
    chown $APPUSER.$APPUSER -R $WORK_DIR
    chmod -R 777 $WORK_DIR/data

    return 0
}

function parse_mysql_user { 
    local RES=`cat $MYSQL_CONF | grep -m 1 "^\s*user\s*=" | sed 's/^.*=\s*\"\?\([^\"]*\)\"\?/\1/g'`
    echo $RES
}

function parse_mysql_password { 
   local RES=`cat $MYSQL_CONF | grep -m 1 "^\s*password\s*=" | awk -F 'password=' '{print $2}' | sed 's/\"//g' | sed 's/'\''//g'`
   if [ -z $RES ]; then
      RES=`cat $MYSQL_CONF | grep -m 1 "^\s*pass\s*=" | awk -F 'pass=' '{print $2}' | sed 's/\"//g' | sed 's/'\''//g'`
   fi
   echo $RES
}

function create_database {
    local MYSQL_CONF=$1
    local DB_NAME=$2
    local DB_USER=$3
    local DB_PASS=$4

    if [ ! -f $MYSQL_CONF ]; then
        echo "$INVALID_MYSQL_CONFIG_MSG: $MYSQL_CONF"
        return 1
    fi

    local MYSQL_USER=$(parse_mysql_user $MYSQL_CONFIG)
    local MYSQL_PASS=$(parse_mysql_password $MYSQL_CONFIG)

    local SQL_CREATE_DATABASE="CREATE DATABASE $DB_NAME;"
    local SQL_DROP_USER_STATEMENT="DROP USER '$DB_USER'@'localhost';"
    local SQL_USER_STATEMENT="CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';GRANT USAGE ON * . * TO '$DB_USER'@'localhost';GRANT SELECT,ALTER,INSERT,UPDATE,DELETE,CREATE,DROP,INDEX,REFERENCES ON \`$DB_NAME\` . * TO '$DB_USER'@'localhost';FLUSH PRIVILEGES;"

    echo "$SQL_CREATE_DATABASE" | mysql -u$MYSQL_USER -p$MYSQL_PASS 2>/dev/null
    echo "$SQL_DROP_USER_STATEMENT" | mysql -u$MYSQL_USER -p$MYSQL_PASS 2>/dev/null
    echo "$SQL_USER_STATEMENT" | mysql -u$MYSQL_USER -p$MYSQL_PASS
}

function remove_database {
    local MYSQL_CONF=$1
    local DB_NAME=$2
    local DB_USER=$3

    if [ ! -f $MYSQL_CONF ]; then
	echo "$INVALID_MYSQL_CONFIG_MSG: $MYSQL_CONF"
	return 1
    fi

    local MYSQL_USER=$(parse_mysql_user $MYSQL_CONFIG)
    local MYSQL_PASS=$(parse_mysql_password $MYSQL_CONFIG)
    
    local SQL_DROP_DATABASE="DROP DATABASE $DB_NAME;"
    local SQL_DROP_USER="DROP USER '$DB_USER'@'localhost';"

    echo "$SQL_DROP_DATABASE" | mysql -u$MYSQL_USER -p$MYSQL_PASS 2>/dev/null
    echo "$SQL_DROP_USER" | mysql -u$MYSQL_USER -p$MYSQL_PASS 2>/dev/null

}


function install_package {
    SOURCE=$1
    PACKAGE_DIR=$2
    PACKAGE_OWNER=$3
    local MYSQL_CONFIG=$4
    
    check_requirements
    if [ $? -gt 0 ]; then
	return 1
    fi

    check_installed_package $PACKAGE_DIR
    if [ $? -lt 1 ]; then
	echo "$ALREADY_INSTALLED_MSG"
	return 1
    fi

    
    download_and_extract $SOURCE $PACKAGE_DIR $PACKAGE_OWNER 0
    if [ $? -gt 0 ]; then
	return 1 
    fi
    
    local DB_NAME="cp_aftlgc"
    local DB_USER="cp_aftlgc"
    local DB_PASS=`perl -le'print map+(A..Z,a..z,0..9)[rand 62],0..7'`
    if [ $? -gt 0 ]; then
	echo "$PASSWORD_GENERATION_FAILED_MSG"
	return 1
    fi
    
    create_database $MYSQL_CONFIG $DB_NAME $DB_USER $DB_PASS
    if [ $? -gt 0 ]; then
	return 1 
    fi
    
    configure_package $PACKAGE_DIR $DB_NAME $DB_USER $DB_PASS
    if [ $? -gt 0 ]; then
	return 1 
    fi
    
}

function upgrade_package {
    SOURCE=$1
    PACKAGE_DIR=$2
    PACKAGE_OWNER=$3

    check_installed_package $PACKAGE_DIR
    if [ $? -gt 0 ] ; then
	echo "$NOT_INSTALLED_MSG"
	return 1
    fi
    
    download_and_extract $SOURCE $PACKAGE_DIR $PACKAGE_OWNER 1
    if [ $? -gt 0 ] ; then
	return 1
    fi
    
    configure_package $PACKAGE_DIR
    if [ $? -gt 0 ] ; then
	return 1
    fi
    
}

function remove_package {
    local WORK_DIR=$1
    local MYSQL_CONF=$2
    local DB_NAME="cp_aftlgc"
    local DB_USER="cp_aftlgc"
    local PAR_DIR="$(dirname "$WORK_DIR")"

    remove_database $MYSQL_CONF $DB_NAME $DB_USER
    rm -rf $PAR_DIR
    
}
