// Rule-based guidance engine — turns the app's own data into plain-language // next steps, the way Legacy Logic's "personalized report" and Rafiq's // contextual coaching do. Deliberately rule-based against data already // captured in this app, not a call to an external model: every recommendation // here traces to a concrete fact (an unverified asset, a missing attestor, // zero policies logged), not a generated guess. export function buildRecommendations(data) { const { exposedTotal = 0, exposedCount = 0, unverifiedCount = 0, wassiyahCount = 0, estateTotal = 0, insuranceCount = 0, zakatConfigured = false, hasCashOrGold = false, unlinkedLiabilityCount = 0, confirmedAttestorCount = 0, hasAgent = false, waqfConfigured = false } = data; const items = []; if (exposedTotal > 0) { items.push({ severity: 'high', text: `${exposedCount} asset${exposedCount === 1 ? ' is' : 's are'} still exposed to the slow Faraid/probate queue (${exposedTotal.toLocaleString()} total). Cover the highest-value one first — Hibah, Waqf, or a Nomination.`, tab: 'Coverage' }); } if (estateTotal > 0 && wassiyahCount === 0) { items.push({ severity: 'medium', text: 'No Wassiyah bequests recorded yet. Up to a third of your estate can go to non-heirs or charity — worth setting up even alongside Faraid.', tab: 'Wassiyah' }); } if (unverifiedCount > 0) { items.push({ severity: 'medium', text: `${unverifiedCount} asset${unverifiedCount === 1 ? '' : 's'} still unverified — attach proof (title, grant, cover note) and get it confirmed so there's no dispute later.`, tab: 'Assets' }); } if (unlinkedLiabilityCount > 0) { items.push({ severity: 'low', text: `${unlinkedLiabilityCount} liabilit${unlinkedLiabilityCount === 1 ? 'y is' : 'ies are'} not linked to the asset securing it — link it so the net estate calculation stays accurate.`, tab: 'Assets' }); } if (insuranceCount === 0) { items.push({ severity: 'low', text: 'No life or Takaful policies logged. If you have any, add them — payouts usually go straight to a named beneficiary, outside Faraid entirely.', tab: 'Insurance' }); } if (hasCashOrGold && !zakatConfigured) { items.push({ severity: 'low', text: 'You have cash or gold logged but no Zakat calculation set up. Check whether you\'re above Nisab this year.', tab: 'Zakat' }); } if (confirmedAttestorCount < 2) { items.push({ severity: 'medium', text: 'Fewer than 2 attestors are confirmed on your death trigger. Without them, your mutawalli/agent can\'t fire the trigger when the time comes.', tab: 'Trigger' }); } if (!hasAgent) { items.push({ severity: 'low', text: 'No estate agent/mutawalli assigned to this family yet. Without one, only the owner can execute triggers and confirm assets.', tab: 'Family' }); } if (estateTotal > 0 && !waqfConfigured) { items.push({ severity: 'low', text: 'No Waqf designation set up. If any part of your estate is meant as a lasting charitable endowment, this is where to set it aside.', tab: 'Family Waqf' }); } const order = { high: 0, medium: 1, low: 2 }; return items.sort((a, b) => order[a.severity] - order[b.severity]); }