Skip to content
Snippets Groups Projects
mucus.js 1.38 KiB
Newer Older
export default function (cycleDays, tempEvalEndIndex) {
  const mucusDays = cycleDays.filter(day => day.mucus && !day.mucus.exclude)
  const bestQuality = Math.max(...mucusDays.map(day => day.mucus.value))

  for (let i = 0; i < mucusDays.length; i++) {
    const day = mucusDays[i]
    if (day.mucus.value !== bestQuality) continue

    // sensiplan says the three following days must be of lower quality
    // AND no best quality day may occur until temperature evaluation has
    // been completed
    const threeFollowingDays = mucusDays.slice(i + 1, i + 4)
    if (threeFollowingDays.length < 3) continue
    const bestQualityOccurringIn3FollowingDays = threeFollowingDays.some(day => day.mucus.value >= bestQuality)
    if (bestQualityOccurringIn3FollowingDays) continue
    // FIXME mucus peak can be same day as first higher measurement
    const cycleDayIndex = cycleDays.indexOf(day)
    const relevantDays = cycleDays
      .slice(cycleDayIndex + 1, tempEvalEndIndex + 1)
      .filter(day => day.mucus && !day.mucus.exclude)

    const evaluationCompleteDay = relevantDays.length > 3 ?
      relevantDays[relevantDays.length - 1] : threeFollowingDays[threeFollowingDays.length - 1]
    if (relevantDays.every(day => day.mucus.value < bestQuality)) {
      return {
        detected: true,
        mucusPeak: day,
        evaluationCompleteDay
      }
    }

  return { detected: false }