/** Assemble every tracked result in the previous seven Istanbul calendar dates. */ export function createBriefBuilder({ trackedKeys, upcoming, results, parseDate }) { return function buildBrief(email, tenders, now = new Date()) { const yaklasan = upcoming(email, tenders, 7, now); const today = new Date(now.getTime() + 3 * 3600000).toISOString().slice(0,10); const end = Date.parse(today + 'T00:00:00+03:00'); const start = end - 7 * 86400000; const dated = []; for (const ikn of new Set(trackedKeys(email))) { for (const result of results(ikn) || []) { const date = parseDate(result.sozlesmeTarihi) || parseDate(result.tarih); if (!date || date.getTime() < start || date.getTime() >= end) continue; dated.push({ timestamp:date.getTime(), value:{ ikn, baslik:result.baslik, kazanan:result.kazananFirma, bedel:result.sozlesmeBedeli, birim:result.paraBirimi, teklif:result.teklifSayisi } }); } } dated.sort((a,b) => b.timestamp-a.timestamp || String(a.value.ikn).localeCompare(String(b.value.ikn),'tr')); const sonuclar = dated.map(row=>row.value); const hafta = now.toLocaleDateString('tr-TR', { timeZone:'Europe/Istanbul', day:'2-digit', month:'long', year:'numeric' }); return { hafta, yaklasan, sonuclar, bos:!yaklasan.length && !sonuclar.length }; }; } /** Keep UTF-16 surrogate pairs intact while bounding each Telegram message. */ export function splitBriefText(text, limit=3900) { if (!Number.isInteger(limit) || limit < 2 || limit > 3900) throw new Error('Geçersiz mesaj uzunluğu.'); const parts=[]; let part=''; for (const char of String(text)) { if (part.length + char.length > limit) { parts.push(part); part=''; } part += char; } if (part) parts.push(part); return parts; }