Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5.
/* dashboard.js — Masticationpedia (colla UI) */
// ---------- Utilità ----------
const $ = sel => document.querySelector(sel);
const $$ = sel => Array.from(document.querySelectorAll(sel));

function logActivity(msg) {
  const box = $('#activityLogContent');
  if (!box) return;
  const now = new Date();
  const hh = now.toTimeString().slice(0,8);
  const line = `[${hh}] ${msg}`;
  const pre = document.createElement('div');
  pre.textContent = line;
  box.prepend(pre);
}

async function postJSON(url, body) {
  const r = await fetch(url, {
    method: 'POST',
    headers: {'Content-Type':'application/json'},
    body: JSON.stringify(body || {})
  });
  // alcuni endpoint tornano text; gestisco entrambe
  const txt = await r.text();
  try { return JSON.parse(txt); } catch { return {ok:false, raw:txt}; }
}

// ---------- Toggle sezioni ----------
window.toggleDashboardBox = function(id){
  // chiudi tutte
  ['api-settings','project-status','chatgpt-plus','test-tools','activity-log'].forEach(i=>{
    const el = document.getElementById(i);
    if (el) el.style.display = 'none';
  });
  // apri quella scelta
  const box = document.getElementById(id);
  if (box) box.style.display = 'block';
};

// ---------- Clear log server ----------
window.clearServerLog = async function(){
  try {
    const r = await fetch('/dashboard/api/log_clear.php', {cache:'no-store'});
    const j = await r.json();
    if (j.ok) {
      alert('Log svuotato ✅');
      logActivity('🧹 Log server svuotato');
    } else {
      alert('Errore svuota log: ' + (j.error||''));
      logActivity('❌ Errore svuota log');
    }
  } catch(e) {
    alert('Errore rete: ' + e.message);
  }
};

// ---------- Test API OpenAI ----------
window.testAPIConnection = async function(){
  const model  = ($('#model-select')?.value || 'gpt-4o-2024-05-13').trim();
  const prompt = ($('#test-prompt')?.value || 'Dimmi una curiosità sulla mandibola').trim();

  logActivity(`🚀 Test API via proxy — Modello: ${model}`);
  const res = await postJSON('/dashboard/api/openai_project_gpt.php', {model, prompt});
  if (res.status === 'ok' && res.result) {
    logActivity(`✅ Proxy OK — Modello: ${model}`);
    const out = $('#gptResponse');
    if (out) out.textContent = res.result;
  } else {
    logActivity(`❌ Proxy errore: ${(res.error||res.raw||'sconosciuto')}`);
    alert('Errore API: ' + (res.error||res.raw||''));
  }
};

// ---------- Analizza progetto (Stato Progetti) ----------
function buildPromptForGPT(){
  const goal        = ($('#p_goal')?.value||'').trim();
  const audience    = ($('#p_audience')?.value||'').trim();
  const deliverable = ($('#p_deliverable')?.value||'').trim();
  const constraints = ($('#p_constraints')?.value||'').trim();

  const parts = [];
  parts.push('Sei un project manager ed editor senior. Rispondi in ITALIANO. Fornisci un piano chiaro e operativo.');
  if (goal)        parts.push('\n# Obiettivo\n' + goal);
  if (audience)    parts.push('\n# Pubblico\n' + audience);
  if (deliverable) parts.push('\n# Output atteso\n' + deliverable);
  if (constraints) parts.push('\n# Vincoli\n' + constraints);
  parts.push(`
# Formato output richiesto
- Sommario introduttivo
- Punti di forza e rischi
- Piano step-by-step (milestones)
- File/Config necessari dal server (ELENCO puntuale dei file da leggere)
- Risorse & Budget hint
- Metriche di successo`);

  return parts.join('\n');
}

window.runProjectAnalysis = async function(){
  const btn = $('#btnAnalyze');
  if (!btn) return;
  btn.disabled = true; btn.textContent = 'Analizzo…';
  try {
    const prompt = buildPromptForGPT();
    const model  = ($('#model-select')?.value || 'gpt-4o-2024-05-13').trim();
    const res = await postJSON('/dashboard/api/openai_project_gpt.php', {model, prompt});
    if (res.status === 'ok' && res.result) {
      const out = $('#gptResponse');
      if (out) out.textContent = res.result;
      logActivity('🧠 Analisi GPT completata');
    } else {
      const msg = res.error || res.raw || 'Errore sconosciuto';
      logActivity('❌ Analisi GPT fallita: ' + msg);
      alert('Errore analisi: ' + msg);
    }
  } catch(e){
    alert('Errore rete: ' + e.message);
  } finally {
    btn.disabled = false; btn.textContent = 'Analizza con GPT';
  }
};

// ---------- Progetti (crea + lista) ----------
async function refreshProjects(){
  const list = $('#projectsList');
  if (!list) return;
  list.innerHTML = '<em>Carico…</em>';
  try {
    const r = await fetch('/dashboard/api/project_list.php', {cache:'no-store'});
    const j = await r.json();
    if (!j.ok || !Array.isArray(j.projects)) { list.textContent = 'Nessun progetto.'; return; }
    if (!j.projects.length) { list.textContent = 'Nessun progetto.'; return; }
    list.innerHTML = j.projects.map(name => `
      <li style="display:flex;gap:8px;align-items:center;margin:4px 0;">
        <code>${name}</code>
        <button data-open="${name}">Apri</button>
        <button data-zip="${name}">ZIP</button>
        <button data-del="${name}" title="Sposta nel cestino">🗑️</button>
      </li>
    `).join('');
    list.querySelectorAll('[data-open]').forEach(b=>{
      b.addEventListener('click', ()=>selectProject(b.getAttribute('data-open')));
    });
    list.querySelectorAll('[data-zip]').forEach(b=>{
      b.addEventListener('click', ()=>zipProject(b.getAttribute('data-zip')));
    });
    list.querySelectorAll('[data-del]').forEach(b=>{
      b.addEventListener('click', ()=>deleteProject(b.getAttribute('data-del')));
    });
  } catch(e) {
    list.textContent = 'Errore lista: ' + e.message;
  }
}

async function selectProject(name){
  // eventuale endpoint select (se esiste). Per ora solo log.
  logActivity('📂 Project selezionato: ' + name);
}

async function zipProject(name){
  try {
    const j = await postJSON('/dashboard/api/project_backup.php', { name });
    if (j.ok) { alert('ZIP creato: ' + (j.zip||'')); logActivity('🗜️ Backup creato: ' + (j.zip||'')); }
    else { alert('Errore ZIP: ' + (j.error||'')); }
  } catch(e){ alert('Errore: ' + e.message); }
}

async function deleteProject(name){
  if (!confirm('Spostare nel cestino "'+name+'"?')) return;
  try {
    const j = await postJSON('/dashboard/api/project_delete.php', { name });
    if (j.ok) { logActivity('🗑️ Progetto spostato nel cestino'); refreshProjects(); }
    else { alert('Errore delete: ' + (j.error||'')); }
  } catch(e){ alert('Errore: ' + e.message); }
}

async function createProject(){
  const inp = $('#newProjectName');
  const name = (inp?.value||'').trim();
  if (!name) { alert('Inserisci un nome progetto'); return; }
  try {
    const j = await postJSON('/dashboard/api/project_create.php', { name });
    if (j.ok) {
      logActivity('✅ Progetto creato: ' + name);
      inp.value = '';
      refreshProjects();
    } else {
      alert('Errore creazione: ' + (j.error||''));
    }
  } catch(e) {
    alert('Errore rete: ' + e.message);
  }
}

// ---------- Carica in OpenAI (stub clic pulsante in alto) ----------
window.uploadToOpenAI = function(){
  alert('Funzione "Carica in OpenAI" in preparazione.');
};

// ---------- Bind all ----------
document.addEventListener('DOMContentLoaded', ()=>{
  // bottoni/azioni principali già definiti in HTML
  $('#btnAnalyze') && $('#btnAnalyze').addEventListener('click', window.runProjectAnalysis);
  $('#btnCreateProject') && $('#btnCreateProject').addEventListener('click', createProject);
  refreshProjects();
});