/**
 * Calcola o ri-calcola i dati aggregati da cachare per i gruppi
 * Si può specificare:
 * - il ramo (camera, senato, governo, parlamento, tutti*)
 * - la data (da inizio legislatura a quella data)
 * Se sono passati degli ID (argomenti), sono interpretati come ID di gruppi e il calcolo è fatto solo per loro
 */
function run_opp_build_cache_gruppi($task, $args, $options)
{
    static $loaded;
    // load application context
    if (!$loaded) {
        task_loader();
        $loaded = true;
    }
    echo "memory usage: " . memory_get_usage() . "\n";
    $msg = sprintf("start time: %s\n", date('H:i:s'));
    echo $msg;
    $data = '';
    $ramo_esteso = 'parlamento';
    $verbose = false;
    if (array_key_exists('data', $options)) {
        $data = $options['data'];
    }
    if (array_key_exists('ramo', $options)) {
        $ramo_esteso = $options['ramo'];
    }
    if (array_key_exists('verbose', $options)) {
        $verbose = true;
    }
    // definisce la data fino alla quale vanno fatti i calcoli
    // data_lookup serve per controllare se i record già esistono
    if ($data != '') {
        $legislatura_corrente = OppLegislaturaPeer::getCurrent($data);
        $data_lookup = $data;
    } else {
        $legislatura_corrente = OppLegislaturaPeer::getCurrent();
        $data = date('Y-m-d');
        $data_lookup = OppPoliticianHistoryCachePeer::fetchLastData('G');
    }
    // costruisce array di rami a partire da ramo esteso
    switch ($ramo_esteso) {
        case 'parlamento':
        case 'tutti':
            $rami = array('C', 'S');
            break;
        case 'camera':
            $rami = array('C');
            break;
        case 'senato':
            $rami = array('S');
            break;
        default:
            $rami = array();
            break;
    }
    foreach ($rami as $ramo) {
        $msg = sprintf("calcolo aggregazione per gruppi - data: %s, ramo: %s\n", $data, $ramo);
        echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
        if (count($args) > 0) {
            try {
                $gruppi_rs = OppGruppoPeer::getRSFromIDArray($args);
            } catch (Exception $e) {
                throw new Exception("Specificare degli ID validi. \n" . $e);
            }
        } else {
            $gruppi_rs = OppGruppoPeer::getGruppiRamoDataRS($ramo, $data);
        }
        $cnt = 0;
        while ($gruppi_rs->next()) {
            $cnt++;
            $g = $gruppi_rs->getRow();
            $nome = $g['nome'];
            $acronimo = $g['acronimo'];
            $id = $g['id'];
            printf("%4d) %30s (%10s) [%6d] ... ", $cnt, $nome, $acronimo, $id);
            $numero = OppPoliticianHistoryCachePeer::countRecordsGruppoRamoData($id, $ramo, $data);
            if ($numero > 0) {
                $dati = OppPoliticianHistoryCachePeer::aggregaDatiGruppoRamoData($id, $ramo, $data);
                // inserimento o aggiornamento del valore in opp_politician_history_cache
                $cache_record = OppPoliticianHistoryCachePeer::retrieveByDataChiTipoChiIdRamo($data_lookup, 'G', $id, $ramo);
                if (!$cache_record) {
                    $cache_record = new OppPoliticianHistoryCache();
                }
                $cache_record->setLegislatura($legislatura_corrente);
                $cache_record->setChiTipo('G');
                $cache_record->setChiId($id);
                $cache_record->setRamo($ramo);
                $cache_record->setGruppoId($id);
                // ridondante, ma ok
                $cache_record->setIndice($dati['indice']);
                $cache_record->setPresenze($dati['presenze']);
                $cache_record->setAssenze($dati['assenze']);
                $cache_record->setMissioni($dati['missioni']);
                $cache_record->setRibellioni($dati['ribellioni']);
                $cache_record->setData($data);
                $cache_record->setNumero($numero);
                // serve per ricostruire la somma aggregata
                $cache_record->setUpdatedAt(date('Y-m-d H:i'));
                // forza riscrittura updated_at, per tenere traccia esecuzioni
                $cache_record->save();
                unset($cache_record);
                $msg = sprintf("i: %7.2f  p:%7.2f  a:%7.2f  m:%7.2f   r:%7.2f (su %d membri)", $dati['indice'], $dati['presenze'], $dati['assenze'], $dati['missioni'], $dati['ribellioni'], $numero);
                echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
            } else {
                $msg = sprintf("nessun dato da aggregare!");
                echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
            }
            echo "\n";
        }
    }
    $msg = sprintf("end time: %s\n", date('H:i:s'));
    echo $msg;
    $msg = sprintf("memory usage: %10d\n", memory_get_usage());
    echo pakeColor::colorize($msg, array('fg' => 'red', 'bold' => false));
}