// Screen Test - Main JS document.addEventListener('DOMContentLoaded', function () { // --- Element Selectors --- const form = document.getElementById('idea-form'); const submitButton = form.querySelector('button[type="submit"]'); const personasContainer = document.getElementById('personas-container'); const personasGrid = document.getElementById('personas-grid'); const chatContainer = document.getElementById('chat-container'); const chatCard = document.querySelector('.chat-card'); const chatPersonaName = document.getElementById('chat-persona-name'); const chatPersonaIcon = document.getElementById('chat-persona-icon'); const closeChatBtn = document.getElementById('close-chat'); const chatLog = document.getElementById('chat-log'); const chatForm = document.getElementById('chat-form'); const chatMessageInput = document.getElementById('chat-message-input'); const sendMessageBtn = document.getElementById('send-message-btn'); const analysisSection = document.getElementById('analysis-section'); const generateAnalysisBtn = document.getElementById('generate-analysis-btn'); const analysisContainer = document.getElementById('analysis-container'); const analysisContent = document.getElementById('analysis-content'); // --- State Variables --- let currentSessionId = null; let personasData = []; let activePersona = null; let chatHistory = []; // --- Event Listeners --- // Main form submission -> Generate Personas & Create Session if (form) { form.addEventListener('submit', function (e) { e.preventDefault(); const audience = document.getElementById('target-audience').value; const idea = document.getElementById('business-idea').value; if (!audience || !idea) { alert('Please fill out both Target Audience and Business Idea fields.'); return; } // --- Reset UI and Set Loading State --- personasContainer.classList.add('d-none'); chatContainer.classList.add('d-none'); analysisSection.classList.add('d-none'); analysisContainer.classList.add('d-none'); personasGrid.innerHTML = ''; const originalButtonText = submitButton.innerHTML; submitButton.disabled = true; submitButton.innerHTML = ` Generating...`; // --- Fetch Personas & Create Session --- fetch('api/generate_personas.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ audience, idea }), }) .then(response => { if (!response.ok) return response.json().then(err => { throw new Error(err.error || 'Unknown error generating personas.') }); return response.json(); }) .then(data => { if (data.session_id && data.personas && data.personas.length > 0) { // --- Store Session and Persona Data --- currentSessionId = data.session_id; personasData = data.personas; // Now contains DB IDs renderPersonas(personasData); personasContainer.classList.remove('d-none'); setTimeout(() => personasContainer.scrollIntoView({ behavior: 'smooth', block: 'start' }), 100); } else { throw new Error('The AI did not return valid session data. Please try again.'); } }) .catch(error => { console.error('Error:', error); alert(`An error occurred: ${error.message}`); }) .finally(() => { submitButton.disabled = false; submitButton.innerHTML = originalButtonText; }); }); } // Persona card click -> Open Chat personasGrid.addEventListener('click', function(e) { const card = e.target.closest('.persona-card'); if (card) { const personaIndex = card.dataset.personaIndex; activePersona = personasData[personaIndex]; // activePersona now has the DB ID const gradientIndex = card.classList.contains('persona-gradient-1') ? 1 : card.classList.contains('persona-gradient-2') ? 2 : 3; openChat(activePersona, gradientIndex); } }); // Close chat button closeChatBtn.addEventListener('click', function() { chatContainer.classList.add('d-none'); analysisSection.classList.add('d-none'); analysisContainer.classList.add('d-none'); activePersona = null; }); // Chat form submission -> Send message chatForm.addEventListener('submit', function(e) { e.preventDefault(); const message = chatMessageInput.value.trim(); if (message && activePersona && currentSessionId) { addMessageToChatLog(message, 'user'); chatHistory.push({ sender: 'user', message: message }); chatMessageInput.value = ''; chatMessageInput.style.height = 'auto'; showTypingIndicator(); // --- Fetch Chat Response --- fetch('api/chat.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ session_id: currentSessionId, message: message, persona: activePersona, // persona object now includes the ID history: chatHistory.slice(0, -1) }), }) .then(response => { if (!response.ok) return response.json().then(err => { throw new Error(err.error || 'An API error occurred.') }); return response.json(); }) .then(data => { if (data.response) { addMessageToChatLog(data.response, 'persona'); chatHistory.push({ sender: 'persona', message: data.response }); } else { throw new Error('Empty response from AI.'); } }) .catch(error => { console.error('Chat Error:', error); addMessageToChatLog(`Sorry, I encountered an error: ${error.message}`, 'persona', true); }) .finally(() => { hideTypingIndicator(); }); } }); // Analysis button click -> Generate Analysis generateAnalysisBtn.addEventListener('click', function() { if (!activePersona || !currentSessionId || chatHistory.length < 5) return; const originalButtonText = this.innerHTML; this.disabled = true; this.innerHTML = ` Analyzing...`; // --- Fetch Analysis --- fetch('api/analyze_chat.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ session_id: currentSessionId, persona: activePersona, history: chatHistory }), }) .then(response => { if (!response.ok) return response.json().then(err => { throw new Error(err.error || 'An API error occurred during analysis.') }); return response.json(); }) .then(data => { if (data.analysis) { analysisContent.innerHTML = data.analysis; analysisContainer.classList.remove('d-none'); analysisContainer.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { throw new Error('Empty analysis from AI.'); } }) .catch(error => { console.error('Analysis Error:', error); analysisContent.innerHTML = `
${persona.age}, ${persona.occupation}
${persona.traits}
${persona.concerns}
${persona.style}