#!/usr/bin/env php
<?php

require_once __DIR__ . '/../configuration/linker.php';

use CCR\Log;

// Disable memory limit.
ini_set('memory_limit', -1);

$opts = array(
    'h' => 'help',

    // Logging levels.
    'v' => 'verbose',
    'd' => 'debug',
    'q' => 'quiet',

    'r:' => 'realm:',
);
$args = getopt(implode('', array_keys($opts)), $opts);

if ($args === false) {
    usageAndExit("Failed to parse arguments\n");
}
$realms = array();
$logLevel = -1;
foreach ($args as $key => $value) {
    if (is_array($value) && !in_array($key, array('v', 'r'))) {
        usageAndExit("Multiple values not allowed for '$key'");
    }

    switch ($key) {
        case 'h':
        case 'help':
            usageAndExit();
            break;
        case 'd':
        case 'debug':
            $logLevel = max($logLevel, Log::DEBUG);
            break;
        case 'q':
        case 'quiet':
            $logLevel = max($logLevel, Log::WARNING);
            break;
        case 'verbose':
            $logLevel = max($logLevel, Log::INFO);
            break;
        case 'v':
            $value = is_array($value) ? $value : array($value);
            switch(count($value)){
                case 1:
                    $logLevel = max($logLevel, Log::INFO);
                    break;
                case 2:
                    $logLevel = max($logLevel, Log::DEBUG);
                    break;
            }
            break;
        case 'r':
        case 'realm':
            $realms = is_array($value) ? $value : array($value);
            break;
        default:
            usageAndExit("Unexpected option '$key'\n");
            break;
    }
}

if ($logLevel === -1) {
    $logLevel = Log::NOTICE;
}

$logger = Log::factory(
    'xdmod-build-filter-lists',
    array(
        'file'            => false,
        'mail'            => false,
        'consoleLogLevel' => $logLevel,
    )
);
build($realms, $logger);

function build($realms, $logger){

    try {
        $filterListBuilder = new FilterListBuilder($logger);
        if (count($realms) > 0){
            foreach($realms as $realm){
                if(!empty($realm)){
                    $filterListBuilder->buildRealmLists($realm);
                }
            }
        }
        else {
            $filterListBuilder->buildAllLists();
        }
    } catch (Exception $e) {
        $logger->crit(array(
            'message'    => 'Filter list building failed: ' . $e->getMessage(),
            'stacktrace' => $e->getTraceAsString(),
        ));
        exit(1);
    }
}
function usageAndExit($msg = null)
{
    echo <<<'EOF'

Usage: {$argv[0]} [-v] [-r {realm} -r {realm} ...]

    -h, --help
        Display this message and exit.

    -v, --verbose
        Output info level and above log messages.

    -vv, -d, --debug
        Output debug level and above log messages.

    -q, --quiet
        Output warning level and above log messages.

    -r, --realm
        One for each Realm to build filter list for.
        If none specified, auto discover and build all.

EOF;
    if ($msg !== null) {
        fwrite(STDERR, "\n$msg\n\n");
        exit(1);
    }
    exit;
}
