<?php

if(!isset($page)) $page = "";

// Forza il charset della connessione per gestire correttamente caratteri come "€"
if (isset($mydb) && method_exists($mydb, 'setCharset')) {
    $mydb->setCharset('utf8mb4');
}

// Helper per valutare formule (necessario per calculateBusinessCaseTotals)
if (!function_exists('bc_eval_formula')) {
    function bc_eval_formula($expr, $vars) {
        if ($expr === null || $expr === '') return null;
        // Consenti solo espressioni, non istruzioni con ';' multiple
        foreach (['$',';','<?','?>'] as $bad) {
            if ($bad !== '$' && strpos($expr, $bad) !== false) {
                $expr = str_replace(['<?','?>'], '', $expr);
                break;
            }
        }
        if (is_array($vars)) {
            extract($vars, EXTR_SKIP);
        }
        try {
            return eval('return ' . $expr . ';');
        } catch (Throwable $e) {
            return null;
        }
    }
}

switch($_SRV){
    
case "frmupload":
{
    include "main/contents/frmupload.inc.php";
    
} break;
case "frmuploadC":
{
    include "main/contents/frmuploadc.inc.php";
    
} break;
    
 

 

       case "analizzaSurvey":
            {
                $a_post = [];
                $a_post['id_survey_user'] = $id_survey_user;
                $a_post['id_survey'] = $id_survey;

                $url = "https://www.bitwall.it/admin166/index.php?_SRV=sendSurveytoAi";
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $a_post);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

                if( ! $result = curl_exec($ch)) 
                { 
                   # trigger_error(curl_error($ch)); 
                    echo curl_error($ch);
                } 
                curl_close($ch); 
            try {
                $sql = "UPDATE survey_users SET analisi='".myencodeTxt($result)."' WHERE id=$id_survey_user";
                $log .= "Analisi survey inviata a AI: $sql\n";
               $mydb->ExecSql($sql);
            } catch (Exception $e) {
                echo "Errore nella query ";
                
            } 

                echo $result;

            } break;

        case "saveAndGenerateAnalysis":
            {
                // Recupera il JSON dal body della richiesta
                $input = file_get_contents('php://input');
                $data = json_decode($input, true);

                // Estrai solo i campi factor[ID]
                $factors = [];
                foreach ($data as $key => $value) {
                    if (preg_match('/^factor\[(\d+)\]$/', $key, $matches)) {
                        $factors[$matches[1]] = $value;
                    }
                }

                // Recupera altri dati se servono
                $userId  = isset($data['id_utente']) ? intval($data['id_utente']) : 0;
                $id_item = isset($data['id_item']) ? intval($data['id_item']) : 0;

                    // Inizializza struttura sessione se assente
                    if (!isset($_SESSION['survey'])) {
                        $_SESSION['survey'] = [];
                    }
                    if (!isset($_SESSION['survey'][$userId])) {
                        $_SESSION['survey'][$userId] = [];
                    }
                    if (!isset($_SESSION['survey'][$userId]['factor'])) {
                        $_SESSION['survey'][$userId]['factor'] = [];
                    }


                foreach ($factors as $factorId => $val) {
                    $factorId = intval($factorId);
                    $val = trim($val);
                    //devo rimuovere il punto e sostituire la virgola SOLO se unit = euro
                    // Recupera l'unità del fattore dal database
                    $unit = null;
                    $mydb->setCharset($charset="utf8mb4");
                    $sqlUnit = "SELECT unit FROM business_case_factors WHERE id = '$factorId' LIMIT 1";
                    $mydb->DoSelect($sqlUnit);
                    $log .= "Eseguo query per unità: $sqlUnit\n";
                    if ($rUnit = $mydb->GetRow()) {
                        $unit = $rUnit['unit'];
                        $log .= "Unità trovata per factor $factorId: $unit\n";
                    }
                    //Unità trovata per factor 42: � annuo >> devo modificare il valore
                    // Nota: se il charset non fosse settato correttamente potremmo leggere '�' al posto di '€'
                    if ($unit !== null && (strpos($unit, '€') !== false || strpos($unit, '�') !== false)) {
                        $log .= "Fattore $factorId ha unità in euro, modifico il valore $val\n";
                        $val = str_replace('.', '', $val);
                        $val = str_replace(',', '.', $val);
                        $log .= "Valore modificato in $val\n";
                    }
                    $value = ($val === '') ? -1 : floatval($val);

                    // Upsert: se esiste già un valore per (id_item, factor_id), aggiorna; altrimenti inserisci
                    $sel = "SELECT id FROM srv_business_case_values WHERE id_survey_item='$id_item' AND factor_id='$factorId' ORDER BY id DESC LIMIT 1";
                    $mydb->DoSelect($sel);
                    if ($r = $mydb->GetRow()) {
                        $id_val = intval($r['id']);
                        $sql = "UPDATE srv_business_case_values SET value_raw='$value', id_utente_temp='$userId', data_ins=NOW() WHERE id='$id_val'";
                        $mydb->ExecSql($sql);
                    } else {
                        $sql = "INSERT INTO srv_business_case_values(id_survey_item, factor_id, value_raw, id_utente_temp, data_ins) 
                                VALUES ('$id_item', '$factorId', '$value', '$userId', NOW())";
                        $mydb->ExecSql($sql);
                    }

                        // Aggiorna la sessione per poter rivedere i valori se si torna indietro
                        $_SESSION['survey'][$userId]['factor'][$factorId] = $value;
                }

                echo $res = json_encode($data);
            } break;

            case "chkAnalizzaSurveyBC":
            {
                // Supporta sia GET che POST/JSON
                if (isset($_GET['id_survey_item'])) {
                    $id_item  = intval($_GET['id_survey_item']);
                    $id_queue = intval($_GET['id_queue']);
                } else {
                    $input = file_get_contents('php://input');
                    $data = json_decode($input, true);
                    $id_item = isset($data['id_survey_item']) ? intval($data['id_survey_item']) : 0;
                    $id_queue = isset($data['id_queue']) ? intval($data['id_queue']) : 0;
                }

                $log .= "Check status per queue_id=$id_queue, item=$id_item\n";
                
                $sql = "SELECT * FROM processing_queue WHERE id = $id_queue";
                $mydb->DoSelect($sql);
                $row = $mydb->GetRow();
                
                if (!$row) {
                    $log .= "Queue ID $id_queue non trovato\n";
                    echo json_encode(['error' => true]);
                    break;
                }
                
                $log .= "Status queue ID $id_queue: " . $row['status'] . "\n";
                
                if($row['status'] == 'DONE') {
                    echo json_encode(['success' => true]);
                    break;
                }
                if($row['status'] == 'ERROR') {
                    echo json_encode(['error' => true, 'message' => $row['error_message']]);
                    break;
                }

                echo json_encode(['status' => 'running']);
            } break;

        case "calculateBusinessCaseTotals":
            {
                // Riceve un array di factor_ids e id_item, restituisce i totali lost/benefit
                $input = file_get_contents('php://input');
                $data = json_decode($input, true);

                $log .= $input."\n";

                ob_start();
                #var_dump($data);

                $id_item = isset($data['id_item']) ? intval($data['id_item']) : 0;
                $factor_ids = isset($data['factor_ids']) && is_array($data['factor_ids']) ? $data['factor_ids'] : [];
                $table_type = isset($data['table_type']) ? $data['table_type'] : 'quantitative';
                $isQualitative = ($table_type === 'qualitative');

                if ($id_item <= 0 || empty($factor_ids)) {
                    echo json_encode(['error' => 'Parametri mancanti', 'sum_lost' => 0, 'sum_benefit' => 0]);
                    exit;
                }

                // Sanitizza gli IDs
                $factor_ids = array_map('intval', $factor_ids);
                $ids_str = implode(',', $factor_ids);

                // Carica i dati economici necessari per i calcoli
                $economicData = [];
                $mydb->setCharset('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;
                $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;

                // Carica i fattori selezionati con valori, formule e trials
                $sql = "SELECT f.id, f.input_type, f.unit, 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 = '$id_item'\n"
                     . "WHERE f.id IN ($ids_str) AND f.is_active = 1";
                $stmt = $mydb->DoSelect($sql);
                #$log .= $sql . "\n";

                $sum_lost = 0.0;
                $sum_benefit = 0.0;
                $count = 0;

                foreach ($stmt as $r) {
                    $fid = intval($r['id']);
                    $value_raw = $r['value_raw'];
                    $type = strtolower((string)$r['input_type']);
                    $unit_factor = isset($r['unit']) ? (string)$r['unit'] : '';

                    // Valore attuale numerico
                    $val_att_num = null;
                    if (!in_array($type, ['select', 'scala', 'scale', 'scale5', 'radio'])) {
                        $val_att_num = is_numeric($value_raw) ? floatval($value_raw) : null;
                        
                        if ($val_att_num !== null) {
                            if ($isQualitative) {
                                // Normalizza su scala 1-5
                                if (stripos($unit_factor, 'Scala') !== false) {
                                    // Già normalizzato
                                } elseif (stripos($unit_factor, '%') !== false) {
                                    // Percentuale: 0-100 → 1-5
                                    $val_att_num = 1 + ($val_att_num / 100.0) * 4.0;
                                }
                            } else {
                                // Quantitativi: converti % in frazione
                                if (strpos($unit_factor, '%') !== false) {
                                    $val_att_num = $val_att_num / 100.0;
                                }
                            }
                        }
                    }

                    if ($val_att_num === null) continue;
                    $count++;

                    // Carica trial
                    $trial = 0.0; $valorelost_trial = 0.0; $trial_is_percentage = false;
                    $sqlT = "SELECT valore_trial, valorelost_trial, unit FROM business_case_trials WHERE factor_id='$fid' LIMIT 1";
                    $stmtT = $mydb->DoSelect($sqlT);#$log .= $sqlT . "\n";
                    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'] : '';
                        if (strpos($unit_trial, '%') !== false) {
                            $trial_is_percentage = true;
                            if ($trial !== 0.0) $trial = $trial / 100.0;
                            if ($valorelost_trial !== 0.0) $valorelost_trial = $valorelost_trial / 100.0;
                        }
                        break;
                    }

                    // Carica formule
                    $formula_code = null; $formula_lost = null;
                    $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 lost e benefit (usando bc_eval_formula)
                    $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,
                    ];

                    $lost_val = null;
                    $benefit_val = null;
                    
                    if ($isQualitative) {
                        // Per qualitativi: valori normalizzati su scala 1-5
                        $lost_val = $val_att_num;
                        
                        // Benefit: se esiste formula usa quella, altrimenti usa trial
                        if (!empty($formula_code)) {
                            $vars['lost'] = $lost_val;
                            if (function_exists('bc_eval_formula')) {
                                $benefit_val = bc_eval_formula($formula_code, $vars);
                            } else {
                                extract($vars, EXTR_SKIP);
                                try {
                                    $benefit_val = eval('return ' . $formula_code . ';');
                                } catch (Throwable $e) {
                                    $benefit_val = null;
                                }
                            }
                        } elseif ($trial > 0) {
                            // Trial per qualitativi è sempre un target assoluto (scala 1-5)
                            $benefit_val = $trial - $val_att_num; // Gap verso target
                            if ($benefit_val < 0) $benefit_val = 0;
                        } else {
                            $benefit_val = 5.0 - $val_att_num;
                        }
                    } else {
                        // Per quantitativi: calcoli in euro
                        if (!empty($formula_lost)) {
                            if (function_exists('bc_eval_formula')) {
                                $lost_val = bc_eval_formula($formula_lost, $vars);
                            } else {
                                extract($vars, EXTR_SKIP);
                                try {
                                    $lost_val = eval('return ' . $formula_lost . ';');
                                } catch (Throwable $e) {
                                    $lost_val = null;
                                }
                            }
                        } elseif ($valorelost_trial > 0) {
                            $lost_val = $val_att_num * $costo_personale_annuo * $valorelost_trial / 100.0;
                        }

                        $vars['lost'] = $lost_val;
                        
                        // Benefit: se esiste formula usa quella, altrimenti applica trial
                        if (!empty($formula_code)) {
                            if (function_exists('bc_eval_formula')) {
                                $benefit_val = bc_eval_formula($formula_code, $vars);
                            } else {
                                extract($vars, EXTR_SKIP);
                                try {
                                    $benefit_val = eval('return ' . $formula_code . ';');
                                } catch (Throwable $e) {
                                    $benefit_val = null;
                                }
                            }
                        } elseif ($trial > 0) {
                            // Senza formula: trial può essere % di miglioramento o valore assoluto
                            if ($trial_is_percentage) {
                                // Trial in %: calcola miglioramento percentuale del valore attuale
                                $benefit_val = $val_att_num * $trial;
                            } else {
                                // Trial assoluto in euro
                                $benefit_val = $trial;
                            }
                        }
                    }

                    // Somma (poi eventualmente faremo la media)
                    if (is_numeric($lost_val)) $sum_lost += floatval($lost_val);
                    if (is_numeric($benefit_val)) $sum_benefit += floatval($benefit_val);
                }
                $out = ob_get_contents();
                $log .= $out;
                ob_end_clean();
                
                // Per qualitativi, calcola media invece di somma
                if ($isQualitative && $count > 0) {
                    $sum_lost = $sum_lost / $count;
                    $sum_benefit = $sum_benefit / $count;
                }

                echo json_encode([
                    'success' => true,
                    'sum_lost' => $sum_lost,
                    'sum_benefit' => $sum_benefit
                ]);
            } break;

        case "analyzeBusinessCaseAI":
            {
                // Riceve id_item, prepara dati e invia a OpenAI per analisi
                $input = file_get_contents('php://input');
                $data = json_decode($input, true);
                
                $id_item = isset($data['id_item']) ? intval($data['id_item']) : 0;
                
                if ($id_item <= 0) {
                    $log .= "Errore: ID item mancante\n";
                    echo json_encode(['error' => 'ID item mancante']);
                    break;
                }
                
                // Controlla se esistono già elaborazioni in corso o pending per questo item
                $mydb->setCharset('utf8mb4');
                $sql = "SELECT id, status, started_at FROM processing_queue 
                        WHERE entity_type='business_case' AND entity_id='$id_item' 
                        AND status IN ('PENDING', 'RUNNING') 
                        ORDER BY created_at DESC LIMIT 1";
                $mydb->DoSelect($sql);
                
                if ($existingQueue = $mydb->GetRow()) {
                    $log .= "Trovato record esistente queue_id=" . $existingQueue['id'] . ", status=" . $existingQueue['status'] . ", started_at=" . $existingQueue['started_at'] . "\n";
                    
                    // Se è RUNNING o PENDING con started_at not null → elaborazione in corso
                    if ($existingQueue['status'] == 'RUNNING' || 
                        ($existingQueue['status'] == 'PENDING' && $existingQueue['started_at'] !== null)) {
                        $log .= "Elaborazione già in corso, richiesta negata\n";
                        echo json_encode([
                            'error' => 'Un\'analisi è già in corso per questo Business Case',
                            'queue_id' => $existingQueue['id']
                        ]);
                        break;
                    }
                    
                    // Se è PENDING con started_at null → record orfano, elimina
                    if ($existingQueue['status'] == 'PENDING' && $existingQueue['started_at'] === null) {
                        $log .= "Record orfano trovato, eliminazione in corso\n";
                        $sql = "DELETE FROM processing_queue 
                                WHERE entity_type='business_case' AND entity_id='$id_item' 
                                AND status='PENDING' AND started_at IS NULL";
                        $mydb->ExecSql($sql);
                        $log .= "Record orfani eliminati\n";
                    }
                }
                
                // Crea record in processing_queue
                $sql = "INSERT INTO processing_queue (entity_type, entity_id, status, created_at) 
                        VALUES ('business_case', '$id_item', 'PENDING', NOW())";
                $mydb->ExecSql($sql);
                $id_queue = $mydb->GetLastInsertedId();
                $log .= "Queue ID creato: $id_queue\n";
                
                // Prepara i dati per l'AI
                $bcData = [];
                
                // 1. Dati economici
                $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);
                $economicData = [];
                foreach ($stmt as $r) {
                    $economicData[$r['field_name']] = mydecodeTxt($r['field_value']);
                }
                $bcData['dati_economici'] = $economicData;
                
                // 2. Fattori quantitativi
                $sql = "SELECT f.label, f.unit, v.value_raw, f.direct
                        FROM business_case_factors f
                        LEFT JOIN srv_business_case_values v ON v.factor_id = f.id AND v.id_survey_item = '$id_item'
                        WHERE f.is_active = 1 AND f.`table` = 'quantitative'
                        AND (v.value_raw IS NOT NULL AND v.value_raw != '-1.00')
                        ORDER BY f.sort_order";
                $stmt = $mydb->DoSelect($sql);
                $bcData['fattori_quantitativi'] = [];
                foreach ($stmt as $r) {
                    $bcData['fattori_quantitativi'][] = [
                        'label' => mydecodeTxt($r['label']),
                        'valore' => $r['value_raw'],
                        'unita' => $r['unit'],
                        'direct' => $r['direct'] == '1'
                    ];
                }
                
                // 3. Fattori qualitativi
                $sql = "SELECT f.label, f.unit, v.value_raw, f.direct
                        FROM business_case_factors f
                        LEFT JOIN srv_business_case_values v ON v.factor_id = f.id AND v.id_survey_item = '$id_item'
                        WHERE f.is_active = 1 AND f.`table` = 'qualitative'
                        AND (v.value_raw IS NOT NULL AND v.value_raw != '-1.00')
                        ORDER BY f.sort_order";
                $stmt = $mydb->DoSelect($sql);
                $bcData['fattori_qualitativi'] = [];
                foreach ($stmt as $r) {
                    $bcData['fattori_qualitativi'][] = [
                        'label' => mydecodeTxt($r['label']),
                        'valore' => $r['value_raw'],
                        'unita' => $r['unit'],
                        'direct' => $r['direct'] == '1'
                    ];
                }
                
                // Aggiorna status a RUNNING
                $sql = "UPDATE processing_queue SET status='RUNNING', started_at=NOW() WHERE id='$id_queue'";
                $mydb->ExecSql($sql);
                
                // Chiama OpenAI API
                global $OPENAI_API_KEY, $OPENAI_MODEL;
 /* prompt base: backup in caso di problemi con getT_VAR("promptAnalisi") */
$prompt = "Sei un consulente esperto in analisi del benessere organizzativo e produttività aziendale.
Hai ricevuto i risultati di un'analisi Business Case chiamata 'SmartLeak Scanner' che identifica le perdite di efficienza e le opportunità di miglioramento in un'organizzazione.
Di seguito trovi i dati raccolti:
**DATI ECONOMICI DELL'AZIENDA:**
||dati_economici||
**FATTORI QUANTITATIVI (perdite economiche misurabili):**
||fattori_quantitativi||
**FATTORI QUALITATIVI (criticità su scala 1-5):**
||fattori_qualitativi||
Genera un report professionale in italiano con questa struttura (USA TAG HTML per la formattazione):
1. **Introduzione** (<h3> + <p>): Contesto e obiettivo dell'analisi SmartLeak Scanner
2. **Sintesi Esecutiva** (<h3> + <p>): Identifica e sintetizza le 3 criticità principali emerse, spiegando perché rappresentano le leve di miglioramento più rilevanti per l’organizzazione.
3. **Analisi Quantitativa** (<h3> + <ul><li>): Commenta le perdite economiche principali e il loro impatto
- cita esplicitamente almeno 5 valori numerici (in € o %)   
- ordina le perdite dalla più rilevante alla meno rilevante
- evidenzia le 2–3 voci che generano almeno il 60–70% dell’impatto complessivo
4. **Analisi Qualitativa** (<h3> + <ul><li>):
Analizza le criticità organizzative emerse (stress, comunicazione, processi)
- Collega, dove possibile, i fattori qualitativi ai principali impatti economici emersi nell’analisi quantitativa (es. stress → assenteismo → costi).
5. **Impatto sul Business** (<h3> + <p>): Collega le criticità all'efficienza aziendale e al benessere dei dipendenti
6. **Raccomandazioni Strategiche** (<h3> + <ol><li>): 5-7 azioni concrete e prioritizzate per migliorare la situazione
7. **Prossimi Passi** (<h3> + <p>): Suggerisci un percorso operativo progressivo che valuti l’introduzione di modelli di lavoro flessibili (es. 4 Day Week o Smart Week) come leva di miglioramento misurabile, indicando condizioni di successo e metriche di monitoraggio.
8. **Indicatori Chiave di Successo (KPI)** (<h3> + <ul><li>): Definisci 5 KPI misurabili da monitorare nei 6–12 mesi successivi all’intervento.
Tono: professionale, consulenziale, orientato alle soluzioni. Lunghezza: 800-1200 parole.
Tag HTML consentiti: <h2>, <h3>, <p>, <strong>, <em>, <ul>, <li>, <ol>, <br>
9. **Smart Week Index (SWI)** (<h3> + <table>): 
Calcola e presenta un indicatore sintetico chiamato “Smart Week Index” su scala 0–100, basato sull’analisi combinata dei fattori quantitativi e qualitativi.
- SWI As-Is: stima dello stato attuale dell’organizzazione
- SWI To-Be: stima del potenziale dopo l’implementazione di modelli di lavoro flessibili (Smart Week / 4 Day Week)
- Delta di Miglioramento: variazione percentuale tra As-Is e To-Be
Metodo:
- pesa maggiormente (≈60%) i fattori quantitativi con impatto economico
- integra (≈40%) i fattori qualitativi legati a benessere, engagement e attrattività
- normalizza il risultato su scala 0–100
Output:
- presenta i valori in una tabella HTML graficamente formattata con tre colonne: As-Is, To-Be, Miglioramento
- fornisci una breve spiegazione testuale (2–3 frasi) di come interpretare l’indice
";


            $prompt = stripslashes(getT_VAR("promptAnalisi"));
            $dati_economici = json_encode($bcData['dati_economici'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
            $fattori_quantitativi = json_encode($bcData['fattori_quantitativi'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
            $fattori_qualitativi = json_encode($bcData['fattori_qualitativi'], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
            $prompt = str_replace('||dati_economici||', $dati_economici, $prompt);
            $prompt = str_replace('||fattori_quantitativi||', $fattori_quantitativi, $prompt);
            $prompt = str_replace('||fattori_qualitativi||', $fattori_qualitativi, $prompt);

            add_log("Prompt per OpenAI:\n" . $prompt . "\n");

                $apiData = [
                    'model' => $OPENAI_MODEL,
                    'messages' => [
                        [
                            'role' => 'system',
                            'content' => 'Sei un consulente esperto in analisi organizzativa, benessere aziendale e produttività. Rispondi sempre in italiano con linguaggio chiaro e professionale.'
                        ],
                        [
                            'role' => 'user',
                            'content' => $prompt
                        ]
                    ],
                    'temperature' => 0.7,
                    'max_tokens' => 2500
                ];
                
                $ch = curl_init('https://api.openai.com/v1/chat/completions');
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($apiData));
                curl_setopt($ch, CURLOPT_HTTPHEADER, [
                    'Content-Type: application/json',
                    'Authorization: Bearer ' . $OPENAI_API_KEY
                ]);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_TIMEOUT, 120);
                
                $response = curl_exec($ch);
                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
                $curlError = curl_error($ch);
                curl_close($ch);
                
                if ($curlError) {
                    $log .= "Errore CURL: $curlError\n";
                    $sql = "UPDATE processing_queue SET status='ERROR', completed_at=NOW(), error_message='" . addslashes($curlError) . "' WHERE id='$id_queue'";
                    $mydb->ExecSql($sql);
                    echo json_encode(['error' => 'Errore di connessione', 'details' => $curlError]);
                    break;
                }
                
                if ($httpCode != 200) {
                    $log .= "Errore HTTP $httpCode: " . substr($response, 0, 200) . "\n";
                    $sql = "UPDATE processing_queue SET status='ERROR', completed_at=NOW(), error_message='HTTP $httpCode: " . addslashes(substr($response, 0, 500)) . "' WHERE id='$id_queue'";
                    $mydb->ExecSql($sql);
                    echo json_encode(['error' => 'API Error', 'http_code' => $httpCode]);
                    break;
                }
                
                $result = json_decode($response, true);
                $log .= "Risposta API ricevuta, lunghezza: " . strlen($response) . " bytes\n";
                
                if (!isset($result['choices'][0]['message']['content'])) {
                    $log .= "Errore: risposta API non contiene content\n";
                    $sql = "UPDATE processing_queue SET status='ERROR', completed_at=NOW(), error_message='Risposta API non valida' WHERE id='$id_queue'";
                    $mydb->ExecSql($sql);
                    echo json_encode(['error' => 'Risposta non valida dall\'API']);
                    break;
                }
                
                $aiNarrative = $result['choices'][0]['message']['content'];
                // Sanitizza output: rimuove fence ```html ... ``` e aggiunge classi alle tabelle
                $aiNarrative = preg_replace('/^```html\\s*/i', '', $aiNarrative);
                $aiNarrative = preg_replace('/```\\s*$/', '', $aiNarrative);
                #$aiNarrative = str_replace('<table', '<table class="tablegrid tablegrid3"', $aiNarrative);
                $log .= "Analisi AI generata, lunghezza: " . strlen($aiNarrative) . " caratteri\n";
                
                // Salva il risultato in business_case_results
                $aiNarrative_enc = myencodeTxt($aiNarrative);
                $sql = "INSERT INTO business_case_results (answer_id, html_narrative, created_at) 
                        VALUES ('$id_item', '$aiNarrative_enc', NOW())
                        ON DUPLICATE KEY UPDATE html_narrative='$aiNarrative_enc', created_at=NOW()";
                $mydb->ExecSql($sql);
                $log .= "Risultato salvato in business_case_results per answer_id=$id_item\n";

                // Aggiorna data elaborazione survey
                $sql = "UPDATE survey_items SET data_elab=NOW() WHERE id='$id_item'";
                $mydb->ExecSql($sql);
                
                // Aggiorna processing_queue a DONE
                $sql = "UPDATE processing_queue SET status='DONE', completed_at=NOW() WHERE id='$id_queue'";
                $mydb->ExecSql($sql);
                $log .= "Processing queue ID $id_queue aggiornato a DONE\n";
                
                echo json_encode(['success' => true, 'queue_id' => $id_queue]);
            } break;

}
