<?php
// elabora_business_case.php
// Mostra i fattori del Business Case compilati dall'utente (solo valori presenti)

// Prerequisiti variabili dall'ambiente chiamante (surveys.php):
// - $id_item: id dell'item del survey (survey_items.id)
// - $mydb: handler DB con metodi DoSelect/GetRow/ExecSql

if (!isset($id_item) || intval($id_item) <= 0) {
    echo '<h1>Nessun dato da elaborare</h1>';
    return;
}

// Helper per normalizzare unità in visualizzazione
function bc_format_unit($unit) {
    if ($unit === null) return '';
    $u = str_replace('?', '/', $unit);
    if (strpos($u, '%') !== false) return '%';
    if (strpos($u, '€') !== false) return '€';
    return $u;
}

// Helper per formattare valore per unità (minima formattazione non invasiva)
function bc_format_value($value_raw, $unit) {
    if ($value_raw === null || $value_raw === '') return '';
    
    if (!is_numeric($value_raw)) {
        return htmlspecialchars((string)$value_raw, ENT_QUOTES, 'UTF-8');
    }
    
    $num = (float)$value_raw;
    
    // Se l'unità contiene il simbolo €, formatta con separatori migliaia e decimali
    if (strpos($unit, '€') !== false) {
        // Formato italiano: punto per migliaia, virgola per decimali
        return number_format($num, 2, ',', '.');
    }
    
    // Se l'unità contiene %, formatta come intero se .00, altrimenti con decimali e virgola
    if (strpos($unit, '%') !== false) {
        // Verifica se ha decimali significativi
        if ($num == intval($num)) {
            return number_format($num, 0, ',', '.');
        } else {
            return str_replace('.', ',', rtrim(rtrim(sprintf('%.2f', $num), '0'), '.'));
        }
    }
    
    return htmlspecialchars((string)$value_raw, ENT_QUOTES, 'UTF-8');
}

// Valuta una semplice formula (espressione PHP) con variabili consentite
function bc_eval_formula($expr, $vars) {
    if ($expr === null || $expr === '') return null;
    #echo $expr."<br>\n";
    #echo "<pre>";print_r($vars);echo "</pre>";
    // Consenti solo espressioni, non istruzioni con ';' multiple
    // Le formule archiviate sono espressioni tipo "$trial*$val_att*$costo_personale_annuo/100"
    foreach (['$',';','<?','?>'] as $bad) {
        // tolleriamo il prefisso '$' su variabili, quindi non lo blocchiamo
        if ($bad !== '$' && strpos($expr, $bad) !== false) {
            // fallback: pulizia semplice, rimuove tag
            $expr = str_replace(['<?','?>'], '', $expr);
            break;
        }
    }
    // Estrae variabili nel contesto locale
    if (is_array($vars)) {
        extract($vars, EXTR_SKIP);
    }
    try {
        // eval come ritorno di espressione
        // Nota: si presume input trusted (DB controllato)
        return eval('return ' . $expr . ';');
    } catch (Throwable $e) {
        return null;
    }
}

// Recupera fattori attivi con eventuali valori dell'utente per una tabella (quantitative/qualitative)
function bc_get_compiled_rows($mydb, $id_item, $tableKind) {
    $rows = [];
    $mydb->setCharset($charset="utf8mb4");
    // Preleviamo tutti i fattori attivi del tipo richiesto e il valore dell'utente (se presente)
    $sql = "SELECT f.id, f.label, f.input_type, f.unit, f.help_text, f.direct, v.value_raw\n"
         . "FROM business_case_factors f\n"
         . "LEFT JOIN srv_business_case_values v\n"
         . "  ON v.factor_id = f.id AND v.id_survey_item = '" . intval($id_item) . "'\n"
         . "WHERE f.is_active = 1 AND f.`table` = '" . addslashes($tableKind) . "'\n"
         . "ORDER BY f.sort_order";
    $stmt = $mydb->DoSelect($sql);

    foreach ($stmt as $r) {
        $value_raw = $r['value_raw'];
        $type = strtolower((string)$r['input_type']);
        $hasValue = false;

        // Regole di visibilità:
        // - input numerici/text: mostra se value_raw != '-1' (0 è accettato come compilato)
        // - select/scale: mostra se value_raw > 0
        if (in_array($type, ['select', 'scala', 'scale', 'scale5', 'radio'])) {
            $hasValue = (is_numeric($value_raw) && intval($value_raw) > 0);
        } else {
            $hasValue = ($value_raw !== null && $value_raw !== '' && $value_raw !== '-1.00');
        }
        // se è una select, unit viene posta a null per evitare confusione
        //il valore viene convertito in intero e nel numero equivalente di '+' es 3 -> '+++'
        if (in_array($type, ['select', 'scala', 'scale', 'scale5', 'radio'])) {
            $r['unit'] = null;
            $value_raw = intval($value_raw);
            if ($value_raw > 0) {
                $value_raw = str_repeat('+', $value_raw);
            } else {
                $value_raw = '';
            }
        }

        if ($hasValue) {
            // Prepara variabili economiche
            global $economicData, $costo_personale_annuo;
            $dipendenti = isset($economicData['srv_numero_dipendenti']) ? floatval($economicData['srv_numero_dipendenti']) : 0.0;
            $fatturato_annuo = isset($economicData['srv_fatturato_annuo']) ? floatval($economicData['srv_fatturato_annuo']) : 0.0;
            $costo_annuo_per_dip = ($dipendenti > 0 && $costo_personale_annuo > 0) ? ($costo_personale_annuo / $dipendenti) : 0.0;

            // Valore attuale numerico (prima di conversioni per select/scala)
            $val_att_num = null;
            if (!in_array($type, ['select', 'scala', 'scale', 'scale5', 'radio'])) {
                $val_att_num = is_numeric($r['value_raw']) ? floatval($r['value_raw']) : null;
                // Se l'unità del fattore è percentuale, normalizza in frazione (es. 15% -> 0.15)
                $unit_factor = isset($r['unit']) ? (string)$r['unit'] : '';
                if ($val_att_num !== null && strpos($unit_factor, '%') !== false) {
                    $val_att_num = $val_att_num / 100.0;
                }
            }

            // Carica trial e formule per il fattore
            $fid = intval($r['id']);
            $trial = 0.0; $valorelost_trial = 0.0;
            $formula_code = null; $formula_lost = null;

            // Trial
            $sqlT = "SELECT valore_trial, valorelost_trial, unit FROM business_case_trials WHERE factor_id='".$fid."' LIMIT 1";
            $stmtT = $mydb->DoSelect($sqlT);
            foreach ($stmtT as $t) {
                $trial = isset($t['valore_trial']) ? floatval($t['valore_trial']) : 0.0;
                $valorelost_trial = isset($t['valorelost_trial']) ? floatval($t['valorelost_trial']) : 0.0;
                $unit_trial = isset($t['unit']) ? (string)$t['unit'] : '';
                // Normalizza: se unità è percentuale, i valori sono in % e vanno convertiti in frazione
                if (strpos($unit_trial, '%') !== false) {
                    if ($trial !== 0.0) $trial = $trial / 100.0;
                    if ($valorelost_trial !== 0.0) $valorelost_trial = $valorelost_trial / 100.0;
                }
                break;
            }

            // Formulae
            $sqlF = "SELECT formula_code, formula_lost FROM business_case_formulae WHERE factor_id='".$fid."' LIMIT 1";
            $stmtF = $mydb->DoSelect($sqlF);
            foreach ($stmtF as $f) {
                $formula_code = $f['formula_code'];
                $formula_lost = $f['formula_lost'];
                break;
            }

            // Calcola prima Valore perso, poi Potenziale beneficio (alcune formule lo richiedono)
            $lost_val = null; $benefit_val = null;
            $vars = [
                'val_att' => $val_att_num,
                'val_post' => null,
                'trial' => $trial,
                'valorelost_trial' => $valorelost_trial,
                'dipendenti' => $dipendenti,
                'costo_personale_annuo' => $costo_personale_annuo,
                'costo_annuo_per_dip' => $costo_annuo_per_dip,
                'fatturato_annuo' => $fatturato_annuo,
                'ricavi_annui' => $fatturato_annuo,
            ];

            if ($val_att_num !== null) {
                if (!empty($formula_lost)) {
                    $lost_val = bc_eval_formula($formula_lost, $vars);
                } elseif ($valorelost_trial > 0) {
                    // fallback generico: proporzionale al costo personale
                    $lost_val = $val_att_num * $costo_personale_annuo * $valorelost_trial / 100.0;
                }
                // Rende disponibile $lost alle formule di miglioramento
                $vars['lost'] = $lost_val;
                if (!empty($formula_code)) {
                    $benefit_val = bc_eval_formula($formula_code, $vars);
                }
            }

            $rows[] = [
                'factor_id' => $fid,
                'label' => $r['label'],
                'unit' => $r['unit'],
                'value_raw' => $value_raw,
                'help_text' => $r['help_text'],
                'lost_value' => $lost_val,
                'benefit_value' => $benefit_val,
                'direct' => $r['direct']
            ];
        }
    }

    return $rows;
}

// Recupera dati economici da survey_items_data (necessari per i calcoli)
$economicData = [];
$mydb->setCharset($charset="utf8mb4");
$sql = "SELECT field_name, field_value FROM survey_items_data WHERE id_survey_item='$id_item' 
        AND field_name IN ('srv_fatturato_annuo', 'srv_numero_dipendenti', 'srv_costo_personale_annuo', 'srv_utile_annuo')";
$stmt = $mydb->DoSelect($sql);
foreach ($stmt as $r) {
    $economicData[$r['field_name']] = mydecodeTxt($r['field_value']);
}

$costo_personale_annuo = isset($economicData['srv_costo_personale_annuo']) ? floatval($economicData['srv_costo_personale_annuo']) : 0.0;

// Ora possiamo calcolare le righe con le formule
$quantRows = bc_get_compiled_rows($mydb, $id_item, 'quantitative');
$qualRows  = bc_get_compiled_rows($mydb, $id_item, 'qualitative');

// Titolo pagina
echo '<div class="titolo_big">SmartLeak Scanner - Riepilogo</div>';
echo '<div class="spessore"></div>';
echo '<div class="spessore"></div>';

// Tabella Dati Economici
if (!empty($economicData)) {
    echo '<div class="titolo">Dati Economici</div>';
    echo '<div class="spessore"></div>';
    echo '<table class="table tablegrid3" style="margin-left:auto; margin-right:auto; width:90%;">';
    echo '<thead><tr><th>Dato</th><th>Valore</th></tr></thead><tbody>';
    
    $economicLabels = [
        'srv_fatturato_annuo' => 'Fatturato annuo',
        'srv_numero_dipendenti' => 'Numero dipendenti',
        'srv_costo_personale_annuo' => 'Costo del personale annuo',
        'srv_utile_annuo' => 'Utile annuo'
    ];
    
    foreach ($economicLabels as $field => $label) {
        if (isset($economicData[$field]) && $economicData[$field] !== '') {
            $value = $economicData[$field];
            // Formatta come euro, tranne numero_dipendenti che è un intero
            if ($field === 'srv_numero_dipendenti') {
                $formatted = number_format(floatval($value), 0, ',', '.');
            } else {
                $formatted = number_format(floatval($value), 2, ',', '.');
            }
            
            echo '<tr>';
            echo '<td>' . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') . '</td>';
            echo '<td>' . $formatted . ($field !== 'srv_numero_dipendenti' ? ' €' : '') . '</td>';
            echo '</tr>';
        }
    }
    
    echo '</tbody></table>';
    echo '<div class="spessore"></div><div class="spessore"></div>';
}

// Render tabella helper
function bc_render_table($title, $rows) {
    if (!is_array($rows)) $rows = [];
    
    // Pre-processing: identifica i primi 8 factors "direct" con benefit più alto
    $directRows = [];
    foreach ($rows as $row) {
        if ($row['direct'] == '1' && isset($row['benefit_value']) && is_numeric($row['benefit_value'])) {
            $directRows[] = [
                'factor_id' => $row['factor_id'],
                'benefit_value' => floatval($row['benefit_value'])
            ];
        }
    }
    
    // Ordina per benefit decrescente
    usort($directRows, function($a, $b) {
        return $b['benefit_value'] <=> $a['benefit_value'];
    });
    
    // Prendi solo i primi 8 factor_id
    $top8DirectIds = array_slice(array_column($directRows, 'factor_id'), 0, 8);
    
    echo '<div class="titolo">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</div>';
    echo '<div class="spessore"></div>';
    echo '<table class="table tablegrid3 bc-table" style="margin-left:auto; margin-right:auto; width:90%;" data-id-item="' . intval($GLOBALS['id_item']) . '">';
    echo '<thead><tr>';
    echo '<th><input type="checkbox" class="bc-select-all" checked onclick="toggleAll(this)" /></th>';
    echo '<th>Fattore</th><th>Valore in input</th>';
    echo '<th class="th-loss">Valore perso</th>';
    echo '<th class="th-benefit">Potenziale beneficio</th>';
    echo '</tr></thead><tbody>';

    if (empty($rows)) {
        echo '<tr><td colspan="5"><em>Nessun dato compilato</em></td></tr>';
    } else {
        $sum_lost = 0.0; $sum_benefit = 0.0;
        $sum_lost_keys = 0.0; $sum_benefit_keys = 0.0;
        foreach ($rows as $row) {
            $flag = "";
            $label = htmlspecialchars($row['label'], ENT_QUOTES, 'UTF-8');
            $unit  = bc_format_unit($row['unit']);
            $val   = bc_format_value($row['value_raw'], $row['unit']);
            // Formatta valori persi/beneficio sempre come € se numerici
            $lost_disp = '';
            $unitvals = "";
            $tdclass = "inactive";
            if (isset($row['lost_value']) && is_numeric($row['lost_value'])) {
                $lost_disp = number_format(floatval($row['lost_value']), 2, ',', '.');
                // Somma nei totali solo se l'unità del fattore è economica (contiene €)
                if (strpos((string)$row['unit'], '€') !== false || strpos((string)$row['unit'], '%') !== false) {
                    $sum_lost += floatval($row['lost_value']);
                    $unitvals = "€";
                    $tdclass = "active";
                    if($row['direct']=='1')
                        {
                             $flag = "**";
                            #$tdclass = "active";
                        }
                   
                }
            }
            $benefit_disp = '';
            if (isset($row['benefit_value']) && is_numeric($row['benefit_value'])) {
                $benefit_disp = number_format(floatval($row['benefit_value']), 2, ',', '.');
                if (strpos((string)$row['unit'], '€') !== false || strpos((string)$row['unit'], '%') !== false) {
                    $sum_benefit += floatval($row['benefit_value']);
                }
            }

            $factor_id = isset($row['factor_id']) ? intval($row['factor_id']) : 0;
            $lost_raw = isset($row['lost_value']) && is_numeric($row['lost_value']) ? floatval($row['lost_value']) : 0;
            $benefit_raw = isset($row['benefit_value']) && is_numeric($row['benefit_value']) ? floatval($row['benefit_value']) : 0;
            $is_monetary = (strpos((string)$row['unit'], '€') !== false || strpos((string)$row['unit'], '%') !== false) ? 1 : 0;
            
            // Determina se questo factor è tra i top 8 diretti
            $isTop8Direct = in_array($factor_id, $top8DirectIds);
            
            // Calcola i totali chiave (top 8 direct checked)
            if ($isTop8Direct && $is_monetary) {
                $sum_lost_keys += $lost_raw;
                $sum_benefit_keys += $benefit_raw;
            }

            $rowClass = 'bc-row' . ($isTop8Direct ? ' bc-row-top8' : '');
            echo '<tr class="' . $rowClass . '" data-factor-id="' . $factor_id . '" data-lost="' . $lost_raw . '" data-benefit="' . $benefit_raw . '" data-monetary="' . $is_monetary . '">';
            // Mostra checkbox solo se $flag è "**" (cioè se è un factor direct)
            // Ma checked solo se è tra i top 8
            if ($flag === "**") {
                $checkedAttr = $isTop8Direct ? 'checked' : '';
                echo '<td><input type="checkbox" id="checkbox_' . $factor_id . '" class="bc-row-checkbox" ' . $checkedAttr . ' onclick="ricalcola()" /></td>';
            } else {
                echo '<td></td>';
            }
            echo '<td class="' . $tdclass . '">' . $label . '</td>';
            echo '<td class="' . $tdclass . '">' . $val . ' ' . htmlspecialchars($unit, ENT_QUOTES, 'UTF-8') . $flag . '</td>';
            echo '<td class="' . $tdclass . '">' . $lost_disp . $unitvals . '</td>';
            echo '<td class="' . $tdclass . '">' . $benefit_disp . $unitvals . '</td>';
            echo '</tr>';
        }
        // Riga totali
        echo '<tr class="totals-row">';
        echo '<td colspan="3" class="totals-label">TOTALE ELEMENTI CHIAVE<br><span class="testosm">Primi 8 elementi più significativi</span></td>';
        echo '<td class="th-loss">' . number_format($sum_lost_keys, 2, ',', '.') . ' €</td>';
        echo '<td class="th-benefit">' . number_format($sum_benefit_keys, 2, ',', '.') . ' €</td>';
        echo '</tr>';

        echo '<tr class="totals-row">';
        echo '<td colspan="3" class="totals-label">TOTALE<br><span class="testosm">Tutti gli elementi chiave</span></td>';
        echo '<td class="th-loss">' . number_format($sum_lost, 2, ',', '.') . ' €</td>';
        echo '<td class="th-benefit">' . number_format($sum_benefit, 2, ',', '.') . ' €</td>';
        echo '</tr>';
    }
    echo '</tbody></table>';
        // Script semplificato per ricalcolo totali

}

// Tabelle: Quantitativi e Qualitativi
bc_render_table('Business Case Light - Analisi Quantitativa', $quantRows);
echo '<div class="spessore"></div><div class="spessore"></div>';
bc_render_table('Business Case Light - Analisi Qualitativa', $qualRows);

?>

<style>
table.tablegrid3 tr.bc-row-top8, .bc-row-top8 {
    background-color: #fffbe6 !important; /* Giallo chiaro */
    background: #fffbe6 !important; /* Giallo chiaro */
}
table.tablegrid3 tr.bc-row-top8:hover, .bc-row-top8:hover {
    background-color: #fff9d6 !important;
    background: #fff9d6 !important;
}
</style>

<script>
        function ricalcola() {
            var tables = document.querySelectorAll("table.bc-table");
            tables.forEach(function(tbl) {
                var idItem = parseInt(tbl.getAttribute("data-id-item")) || 0;
                var selectedIds = [];
                
                tbl.querySelectorAll(".bc-row").forEach(function(row) {
                    var cb = row.querySelector(".bc-row-checkbox");
                    if (cb && cb.checked) {
                        var fid = parseInt(row.getAttribute("data-factor-id"));
                        if (fid > 0) selectedIds.push(fid);
                    }
                });
                console.log(selectedIds);
                if (typeof ajaxSrvJs === "function") {
                    ajaxSrvJs("calculateBusinessCaseTotals", 
                        { id_item: idItem, factor_ids: selectedIds },
                        function(responseText) {
                            try {
                                var data = JSON.parse(responseText);
                                if (data.success) {
                                    var lostFormatted = new Intl.NumberFormat("it-IT", {minimumFractionDigits: 2, maximumFractionDigits: 2}).format(data.sum_lost) + " €";
                                    var benefitFormatted = new Intl.NumberFormat("it-IT", {minimumFractionDigits: 2, maximumFractionDigits: 2}).format(data.sum_benefit) + " €";
                                    
                                    // Aggiorna solo la prima riga dei totali (ELEMENTI CHIAVE)
                                    var totalRows = tbl.querySelectorAll(".totals-row");
                                    if (totalRows.length > 0) {
                                        var firstTotalRow = totalRows[0];
                                        var totalLostCell = firstTotalRow.querySelector(".th-loss");
                                        var totalBenefitCell = firstTotalRow.querySelector(".th-benefit");
                                        if (totalLostCell) totalLostCell.textContent = lostFormatted;
                                        if (totalBenefitCell) totalBenefitCell.textContent = benefitFormatted;
                                    }
                                }
                            } catch(e) {
                                console.error("Errore parsing risposta AJAX:", e);
                                console.error("Risposta:", responseText);
                            }
                        },
                        function(status, responseText) {
                            console.error("Errore AJAX:", status, responseText);
                        }
                    );
                }
            });
        }
        
        function toggleAll(selectAllCb) {
            var tbl = selectAllCb.closest("table.bc-table");
            if (!tbl) return;
            
            var checked = selectAllCb.checked;
            tbl.querySelectorAll(".bc-row-checkbox").forEach(function(cb) {
                cb.checked = checked;
            });
            ricalcola();
        }
</script>


