async function processFile() { try { const fileInput = document.getElementById('fileInput'); const disclaimerCheck = document.getElementById('disclaimerCheck'); const statusMessage = document.getElementById('statusMessage'); const resultDiv = document.getElementById('result'); const analysisText = document.getElementById('analysisText'); const analyzeBtn = document.getElementById('analyzeBtn'); const exportBtn = document.getElementById('exportBtn'); statusMessage.className = 'error'; statusMessage.innerText = ''; resultDiv.classList.add('hidden'); exportBtn.classList.add('hidden'); if (fileInput.files.length === 0) { statusMessage.innerText = 'Please select a file to analyze.'; return; } if (!disclaimerCheck.checked) { statusMessage.innerText = 'Please agree to the legal disclaimer before analyzing.'; return; } const today = new Date().toDateString(); // Tier-based limit checking if (!isPro) { // Free tier: exactly 1 upload per day let freeUploadDate = localStorage.getItem('freeUploadDate'); if (freeUploadDate === today && memoryWorking) { statusMessage.innerText = 'Free tier limit reached: Only 1 upload allowed per day. Please upgrade to Pro for more!'; return; } } else { // Pro tier: Fair use cap of 25 uploads per day let proCount = parseInt(localStorage.getItem('proCount') || '0', 10); let proDate = localStorage.getItem('proDate'); if (proDate !== today) { proCount = 0; // Reset counter for a new day } if (proCount >= 25 && memoryWorking) { statusMessage.innerText = 'Pro daily fair-use limit reached (25/25). Limit resets tomorrow.'; return; } } const file = fileInput.files[0]; analyzeBtn.disabled = true; let documentText = ''; if (file.type === 'application/pdf' || file.name.toLowerCase().endsWith('.pdf')) { statusMessage.className = 'loading'; statusMessage.innerText = 'Step 1: Extracting text from PDF...'; documentText = await extractTextFromPDF(file); } else { statusMessage.className = 'loading'; statusMessage.innerText = 'Step 1: Reading text file...'; documentText = await file.text(); } statusMessage.className = 'loading'; statusMessage.innerText = 'Step 2: Sending document to secure backend...'; const analysisResult = await fetchAIAnalysis(documentText); // Update usage records if (memoryWorking) { if (!isPro) { localStorage.setItem('freeUploadDate', today); } else { let proCount = parseInt(localStorage.getItem('proCount') || '0', 10); let proDate = localStorage.getItem('proDate'); if (proDate !== today) proCount = 0; localStorage.setItem('proCount', proCount + 1); localStorage.setItem('proDate', today); } } statusMessage.innerText = ''; resultDiv.classList.remove('hidden'); exportBtn.classList.remove('hidden'); analysisText.innerHTML = analysisResult; analyzeBtn.disabled = false; } catch (error) { console.error(error); document.getElementById('statusMessage').className = 'error'; document.getElementById('statusMessage').innerText = "Failed: " + error.message; document.getElementById('analyzeBtn').disabled = false; } }