getAyahUQsForSurahAyahRange method

List<int> getAyahUQsForSurahAyahRange({
  1. required int startSurah,
  2. required int startAyah,
  3. required int endSurah,
  4. required int endAyah,
})

إرجاع أرقام UQ لكل الآيات ضمن نطاق عبر السور، مثل 2:15-3:25 (شامل)

Implementation

List<int> getAyahUQsForSurahAyahRange({
  required int startSurah,
  required int startAyah,
  required int endSurah,
  required int endAyah,
}) {
  // تصحيح الترتيب إذا كان البداية بعد النهاية
  bool swapNeeded = (startSurah > endSurah) ||
      (startSurah == endSurah && startAyah > endAyah);
  int sSurah = swapNeeded ? endSurah : startSurah;
  int sAyah = swapNeeded ? endAyah : startAyah;
  int eSurah = swapNeeded ? startSurah : endSurah;
  int eAyah = swapNeeded ? startAyah : endAyah;

  // ضبط الحدود ضمن المدى الصحيح للسور
  sSurah = sSurah.clamp(1, surahs.isEmpty ? 114 : surahs.length);
  eSurah = eSurah.clamp(1, surahs.isEmpty ? 114 : surahs.length);

  final result = <int>{};
  for (int s = sSurah; s <= eSurah; s++) {
    SurahModel? surah;
    try {
      surah = surahs.firstWhere((x) => x.surahNumber == s);
    } catch (_) {
      surah = null;
    }
    if (surah == null || surah.ayahs.isEmpty) continue;
    final int firstAyah = (s == sSurah) ? sAyah : 1;
    final int lastAyah = (s == eSurah)
        ? eAyah
        : surah.ayahs.last.ayahNumber; // آخر آية في السورة

    final int from = firstAyah.clamp(1, surah.ayahs.last.ayahNumber);
    final int to = lastAyah.clamp(1, surah.ayahs.last.ayahNumber);
    for (final a in surah.ayahs) {
      if (a.ayahNumber >= from && a.ayahNumber <= to) {
        result.add(a.ayahUQNumber);
      }
    }
  }
  return result.toList();
}