#!/usr/bin/php
<?php

if (!defined("MB_LIBPATH")){
	define("MB_LIBPATH", realpath(dirname(__FILE__)."/../../../.."));
}

require_once(MB_LIBPATH.'/lib-tk/cli.php');
require_once(MB_LIBPATH.'/lib-tk/include/sso/SSORegister.php');

function printUsage() {
    echo <<< EOX
Usage: sso --command[=app] [options]

    Available commands:
    --enable=<admin|client>        Enable SSO mode
    --disable=<admin|client>       Disable SSO mode
    --set-prefs=<admin|client>     Set SSO preferences
    --get-prefs=<admin|client>     Get SSO preferences
    --help                         Displays this help page

    Available options:
    --server=<SSO Server URL>      Set SSO Server URL
    --ui=[server|custom]           Set SSO Server URL

EOX;
}

function main($argv) {
    if (count($argv) < 2) {
        printUsage();
        return 1;
    } else {
		$args = arguments($argv);
		$commands = array_keys($args['commands']);
		$command = $commands[0];
		$app = $args['commands'][$command];
		$options = array_keys($args['flags']);
		
		if ($command == 'help' || is_numeric($app)) {
			printUsage();
			return 1;
		}

		if ($app != 'admin' && $app != 'client') {
			echo "Wrong application was used: '$app'.\n\n";
			printUsage();
			return 1;
		}

        switch ($command) {
            case 'enable':
                $ret = enableSSO($app, array(
					'server' => $args['commands']['server']
				));
                return $ret;
            case 'disable':
                $ret = disableSSO($app);
                return $ret;
            case 'set-prefs':
				$ret = updateSSO($app, array(
					'server' => $args['commands']['server'],
					'ui' => $args['commands']['ui']
				));
                return $ret;
            case 'get-prefs':
				$ret = getPrefs($app);
                return $ret;
            default:
                echo "Unknown action '$action'\n";
                printUsage();
                return 1;
        }
    }
}

function isEnabled($app = NULL) {
}

function isRegistered($app = NULL) {
}

function enableSSO($app = NULL, $options) {
}

function disableSSO($app = NULL) {
}

function updateSSO($app = NULL, $options) {
	$apps = get_target_apps($app);
	$outputs = array();

	foreach ($apps as $app => $ppb_app) {
		$props = array();
		if ($options['server']) {
			$props['api_url'] = $options['server'];
		}
		if ($options['ui']) {
			$props['ui'] = $options['ui'];
		}
		SSORegister::update($props, $ppb_app);
	}
	
	echo join("\n", $outputs);
}

function getPrefs($app = NULL) {
	$apps = get_target_apps($app);
	$outputs = array();
	
	foreach ($apps as $app => $ppb_app) {
		$sso_server = SSOSettings::getIDPApiUrl($ppb_app);
		$sso_enabled = SSOSettings::ssoIsEnabled(NULL, $ppb_app);
		$sso_sp_registered = SSOSettings::spIsRegistered(NULL, $ppb_app);
		
		$outputs[] =
			  "Application: $app\n"
			. "IdP URL: $sso_server\n"
			. "SP status: "
				. ($sso_sp_registered ? 'registered' : 'unregistered')
				. ' & '
				. ($sso_enabled ? 'enabled' : 'disabled')
				. "\n";
	}
	echo join("\n", $outputs);
}

function get_target_apps($app) {
	$apps = array(
		'admin' => SSOSettings::APP_ADMIN,
		'client' => SSOSettings::APP_CLIENT
	);
	if (strtolower($app) == 'admin') {
		$apps = array(
			'admin' => SSOSettings::APP_ADMIN
		);
	} else
	if (strtolower($app) == 'client') {
		$apps = array(
			'client' => SSOSettings::APP_CLIENT
		);
	}
	return $apps;
}

if ($_SERVER['argc'] > 0) { // If running from command line
    $res = main($_SERVER['argv']);
    exit($res);
}

function arguments ( $args )
{
    array_shift( $args );
    $args = join( $args, ' ' );

    preg_match_all('/ ((--\w+\-\w+|--\w+) (?:[= ] [^-]+ [^\s-] )? ) | (-\w+) | (\w+) /x', $args, $match );
    $args = array_shift( $match );

    $ret = array(
        'input'    => array(),
        'commands' => array(),
        'flags'    => array()
    );

    foreach ( $args as $arg ) {

        // Is it a command? (prefixed with --)
        if ( substr( $arg, 0, 2 ) === '--' ) {

            $value = preg_split( '/[= ]/', $arg, 2 );
            $com   = substr( array_shift($value), 2 );
            $value = join($value);

            $ret['commands'][$com] = !empty($value) ? $value : true;
            continue;

        }

        // Is it a flag? (prefixed with -)
        if ( substr( $arg, 0, 1 ) === '-' ) {
            $ret['flags'][] = substr( $arg, 1 );
            continue;
        }

        $ret['input'][] = $arg;
        continue;

    }

    return $ret;
}

?>