/**
 * Calcola o ri-calcola gli indici di posizionamento per:
 * - presenze, assenze, missioni
 * - indice di attività (nuovo)
 * - ribellioni
 * Si può specificare:
 * - il ramo (camera, senato, governo, parlamento, tutti*)
 * - la data (da inizio legislatura a quella data)
 */
function run_opp_build_pos_cache_politici($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 = '';
    $tipo = 'P';
    if (array_key_exists('data', $options)) {
        $data = $options['data'];
    }
    if (array_key_exists('ramo', $options)) {
        $ramo = substr(strtolower($options['ramo']), 0, 1);
    }
    if ($ramo != 'c' && $ramo != 's') {
        throw new Exception("I valori per il ramo possono essere: camera o senato");
    }
    // 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');
        if ($ramo == 'tutti') {
            $data_lookup = OppPoliticianHistoryCachePeer::fetchLastData($tipo);
        } else {
            $data_lookup = OppPoliticianHistoryCachePeer::fetchLastData($tipo, $ramo);
        }
    }
    $msg = sprintf("calcolo indici posizionamento per politici data: %10s, ramo: %10s\n", $data ? $data : '-', $ramo);
    echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
    $parlamentari_rs = OppCaricaPeer::getParlamentariRamoDataRS($ramo, $legislatura_corrente, $data);
    echo "memory usage: " . memory_get_usage() . "\n";
    $start_time = time();
    $cnt = 0;
    $indice_ar = array();
    $presenze_ar = array();
    $assenze_ar = array();
    $missioni_ar = array();
    $ribellioni_ar = array();
    while ($parlamentari_rs->next()) {
        $cnt++;
        $p = $parlamentari_rs->getRow();
        $id = $p['id'];
        // inserimento o aggiornamento del valore in opp_politician_history_cache
        $cache_record = OppPoliticianHistoryCachePeer::retrieveByDataChiTipoChiIdRamo($data_lookup, $tipo, $id, $ramo);
        if (!$cache_record) {
            throw new Exception("Record {$id} mancante: data: {$data_lookup}, tipo: {$tipo}, ramo: {$ramo}!");
        }
        $record_id = $cache_record->getId();
        $indice_ar[$record_id] = $cache_record->getIndice();
        $presenze_ar[$record_id] = $cache_record->getPresenze();
        $assenze_ar[$record_id] = $cache_record->getAssenze();
        $missioni_ar[$record_id] = $cache_record->getMissioni();
        $ribellioni_ar[$record_id] = $cache_record->getRibellioni();
        unset($cache_record);
        $msg = sprintf("%d)  i: %7.2f   p:%4d    a:%4d   m:%4d,   r:%4d", $cnt, $indice_ar[$record_id], $presenze_ar[$record_id], $assenze_ar[$record_id], $missioni_ar[$record_id], $ribellioni_ar[$record_id]);
        echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
        $msg = sprintf(" [%4d sec] [%10d bytes]\n", time() - $start_time, memory_get_usage());
        echo pakeColor::colorize($msg, array('fg' => 'red', 'bold' => false));
    }
    # update positions
    arsort($indice_ar);
    compute_posizioni($indice_ar, 'indice');
    arsort($presenze_ar);
    compute_posizioni($presenze_ar, 'presenze');
    arsort($assenze_ar);
    compute_posizioni($assenze_ar, 'assenze');
    arsort($missioni_ar);
    compute_posizioni($missioni_ar, 'missioni');
    arsort($ribellioni_ar);
    compute_posizioni($ribellioni_ar, 'ribellioni');
    $msg = sprintf("id: indexing positions generated\n");
    echo pakeColor::colorize($msg, array('fg' => 'green', 'bold' => true));
    $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));
    $msg = sprintf("%d parlamentari elaborati\n", $cnt);
    echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
}
/**
 * Calcola o ri-calcola l'indice di attività.
 * Si può specificare il ramo (camera, senato, governo, tutti) e la data
 * Se sono passati degli ID (argomenti), sono interpretati come ID di politici e il calcolo è fatto solo per loro
 */
function run_opp_calcola_nuovo_indice($task, $args, $options)
{
    static $loaded;
    // load application context
    if (!$loaded) {
        define('SF_ROOT_DIR', sfConfig::get('sf_root_dir'));
        define('SF_APP', 'fe');
        define('SF_ENVIRONMENT', 'task');
        define('SF_DEBUG', false);
        require_once SF_ROOT_DIR . DIRECTORY_SEPARATOR . 'apps' . DIRECTORY_SEPARATOR . SF_APP . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.php';
        sfContext::getInstance();
        sfConfig::set('pake', true);
        error_reporting(E_ALL);
        $loaded = true;
    }
    echo "memory usage: " . memory_get_usage() . "\n";
    $start_time = time();
    $data = '';
    $ramo = '';
    $verbose = false;
    $offset = null;
    $limit = null;
    if (array_key_exists('data', $options)) {
        $data = $options['data'];
    }
    if (array_key_exists('ramo', $options)) {
        $ramo = strtolower($options['ramo']);
    }
    if (array_key_exists('verbose', $options)) {
        $verbose = true;
    }
    if (array_key_exists('offset', $options)) {
        $offset = $options['offset'];
    }
    if (array_key_exists('limit', $options)) {
        $limit = $options['limit'];
    }
    $atti_ids = array();
    if (array_key_exists('atti', $options)) {
        $atti_ids = explode(",", $options['atti']);
    }
    $emendamenti_ids = array();
    if (array_key_exists('emendamenti', $options)) {
        $emendamenti_ids = explode(",", $options['emendamenti']);
    }
    // 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('N');
    }
    $msg = sprintf("calcolo indice di attività - data:   %10s, ramo: %10s\n", $data ? $data : '-', $ramo);
    echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
    if (count($args) > 0) {
        try {
            $parlamentari_rs = OppCaricaPeer::getRSFromIDArray($args);
        } catch (Exception $e) {
            throw new Exception("Specificare degli ID validi. \n" . $e);
        }
    } else {
        $parlamentari_rs = OppCaricaPeer::getParlamentariRamoDataRS($ramo, $legislatura_corrente, $data, $offset, $limit);
    }
    echo "memory usage: " . memory_get_usage() . "\n";
    $cnt = 0;
    while ($parlamentari_rs->next()) {
        $cnt++;
        $p = $parlamentari_rs->getRow();
        $nome = $p['nome'];
        $cognome = $p['cognome'];
        $tipo_carica_id = $p['tipo_carica_id'];
        $id = $p['id'];
        switch ($tipo_carica_id) {
            case 1:
                $ramo = 'C';
                $prefisso = 'On.';
                break;
            case 4:
            case 5:
                $ramo = 'S';
                $prefisso = 'Sen.';
                break;
            case 2:
            case 3:
            case 6:
            case 7:
                $ramo = 'G';
                $prefisso = '';
                break;
            default:
                break;
        }
        $politico_stringa = sprintf("%s %s %s", $prefisso, $nome, strtoupper($cognome));
        printf("%4d) %40s [%06d] ... ", $cnt, $politico_stringa, $id);
        $indice = OppIndiceAttivitaPeer::calcola_indice_politico($id, $legislatura_corrente, $data, $verbose, $atti_ids, $emendamenti_ids);
        // inserimento o aggiornamento del valore in opp_politician_history_cache
        // uso N come ChiTipo, perché P è preso per il vecchio indice.
        // una volta fatta la sostituzione, la scrittura qui è ridondante
        $cache_record = OppPoliticianHistoryCachePeer::retrieveByDataChiTipoChiIdRamo($data_lookup, 'N', $id, $ramo);
        if ($cache_record === null) {
            $cache_record = new OppPoliticianHistoryCache();
        }
        $cache_record->setLegislatura($legislatura_corrente);
        $cache_record->setChiTipo('N');
        $cache_record->setChiId($id);
        $cache_record->setRamo($ramo);
        $cache_record->setIndice($indice);
        $cache_record->setData($data);
        $cache_record->setNumero(1);
        $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("%7.2f", $indice);
        echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
        $msg = sprintf(" [%4d sec] [%10d bytes]\n", time() - $start_time, memory_get_usage());
        echo pakeColor::colorize($msg, array('fg' => 'red', 'bold' => false));
    }
    $msg = sprintf("%d parlamentari elaborati\n", $cnt);
    echo pakeColor::colorize($msg, array('fg' => 'cyan', 'bold' => true));
}