`;
showNextTab(); // Automatically move to the advice tab
// Construct prompt for the LLM
const prompt = `As a personal finance advisor, provide actionable, concise advice based on the following financial situation. Use the US Dollar ($) for currency.
User's Financial Goals: "${goals}"
Monthly Net Income: $${income.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
Total Monthly Expenses: $${expenses.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
Current Savings: $${savings.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
Total Outstanding Debt: $${debt.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
Provide specific recommendations for budgeting, saving, debt management, and investment opportunities relevant to their goals and current status. Structure the advice with clear headings (e.g., "Budgeting", "Saving", "Debt Management", "Investing"). Do not include any disclaimers.`;
let chatHistory = [];
chatHistory.push({ role: "user", parts: [{ text: prompt }] });
const payload = { contents: chatHistory };
const apiKey = ""; // Canvas will automatically provide the API key at runtime.
const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${apiKey}`;
try {
const response = await fetch(apiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await response.json(); // Ensure awaiting the json() parsing
if (result.candidates && result.candidates.length > 0 &&
result.candidates[0].content && result.candidates[0].content.parts &&
result.candidates[0].content.parts.length > 0) {
const text = result.candidates[0].content.parts[0].text;
// Format the text for better readability
const formattedText = text
.replace(/\*\*(.*?)\*\*/g, '$1') // Bold text
.replace(/\n/g, '
'); // Newlines to
for HTML display adviceOutput.innerHTML = formattedText; } else { adviceOutput.innerHTML = '
`;
pdfContentDiv.appendChild(inputsSummary);
// Add the generated advice content
const adviceSection = document.createElement('div');
adviceSection.className = 'p-4 rounded-lg bg-white border border-gray-200';
adviceSection.innerHTML = `
'); // Newlines to
for HTML display adviceOutput.innerHTML = formattedText; } else { adviceOutput.innerHTML = '
Failed to get advice. Please try again.
'; console.error('Unexpected API response structure:', result); showCustomAlert('Error', 'Could not generate advice. Please try again later.'); } } catch (error) { console.error('Error fetching advice:', error); adviceOutput.innerHTML = 'An error occurred while fetching advice. Please check your internet connection or try again later.
'; showCustomAlert('Network Error', 'Could not connect to the advice generator. Please check your internet.'); } } /** * Downloads the generated advice and input summary as a PDF. */ async function downloadPDF() { // Ensure advice is generated before downloading PDF if (adviceOutput.textContent.includes('Please fill out the previous sections')) { showCustomAlert('No Advice Yet', 'Please generate advice first by filling out the previous sections and clicking "Get Advice".'); return; } // Create a temporary div to gather all content for the PDF const pdfContentDiv = document.createElement('div'); pdfContentDiv.className = 'p-6'; // Add some padding for the PDF content // Add heading const heading = document.createElement('h1'); heading.className = 'text-2xl font-bold text-center mb-6 text-gray-800'; heading.textContent = 'Personal Finance Advice Report'; pdfContentDiv.appendChild(heading); // Add user inputs summary const inputsSummary = document.createElement('div'); inputsSummary.className = 'mb-8 bg-gray-50 p-4 rounded-lg border border-gray-200'; inputsSummary.innerHTML = `Your Financial Overview
| Financial Goals: | ${financialGoalsInput.value.trim()} |
| Monthly Net Income: | $${parseFloat(monthlyIncomeInput.value).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} |
| Monthly Expenses: | $${parseFloat(monthlyExpensesInput.value).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} |
| Current Savings: | $${parseFloat(currentSavingsInput.value).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} |
| Total Outstanding Debt: | $${parseFloat(totalDebtInput.value).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} |