{"version":3,"sources":["../src/ifa/index.ts"],"names":[],"mappings":";AAWA,SAAS,WAAW,MAAY,MAAgC;AAC9D,MAAI,SAAS,OAAO;AAClB,WACE,KAAK,YAAY,MAAM,KACvB,KAAK,cAAc,MAAM,KACzB,KAAK,cAAc,MAAM,KACzB,KAAK,mBAAmB,MAAM;AAAA,EAElC;AAEA,SACE,KAAK,SAAS,MAAM,KACpB,KAAK,WAAW,MAAM,KACtB,KAAK,WAAW,MAAM,KACtB,KAAK,gBAAgB,MAAM;AAE/B;AAEA,SAAS,iBAAiB,MAA0D;AAClF,MAAI,EAAE,gBAAgB,SAAS,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAC3D,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,QAAM,eAAe,WAAW,MAAM,OAAO,KAAK,CAAC,WAAW,MAAM,KAAK;AAEzE,MAAI,cAAc;AAChB,WAAO;AAAA,MACL,KAAK,KAAK,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,MAC9C,QAAQ,KAAK,SAAS,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,MACvD,MAAM,KAAK,YAAY,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,gBAAgB,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACrD,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,cAAc,MAAM,GAAG;AAElD,SAAO,EAAE,KAAK,OAAO,KAAK;AAC5B;AAEA,SAAS,aAAa,KAAqB;AACzC,MAAI,OAAO,IAAI;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IACG,SAAS,EACT,MAAM,EAAE,EACR,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,SAAS,OAAO,EAAE,GAAG,CAAC;AAAA,EAC/D;AACF;AAOO,SAAS,aAAa,MAAwB;AACnD,QAAM,EAAE,KAAK,OAAO,KAAK,IAAI,iBAAiB,IAAI;AAGlD,QAAM,cAAc;AAAA,IAClB,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE;AAAA;AAAA,IAC1B,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA;AAAA,IAC5B,OAAO,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA;AAAA,IAC3B,OAAO,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA;AAAA,EAC7B;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE;AAAA;AAAA,IAC1B,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA;AAAA,IAC5B,OAAO,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA;AAAA,IAC3B,OAAO,SAAS,KAAK,CAAC,GAAG,EAAE;AAAA;AAAA,EAC7B;AAGA,QAAM,aAAa,YAAY,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AACxD,QAAM,cAAc,aAAa,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAG1D,QAAM,QAAQ,aAAa,UAAU;AACrC,QAAM,QAAQ,aAAa,WAAW;AACtC,QAAM,OAAO,aAAa,QAAQ,KAAK;AACvC,QAAM,OAAO,aAAa,QAAQ,QAAQ,IAAI;AAC9C,QAAM,SAAS,aAAa,QAAQ,QAAQ,OAAO,IAAI;AAEvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF","sourcesContent":["\nexport type OduNumbers = {\n  leftNumbers: number[],\n  rightNumbers: number[],\n  north: number,\n  south: number,\n  east: number,\n  west: number,\n  center: number\n}\n\nfunction isMidnight(date: Date, mode: \"local\" | \"utc\"): boolean {\n  if (mode === \"utc\") {\n    return (\n      date.getUTCHours() === 0 &&\n      date.getUTCMinutes() === 0 &&\n      date.getUTCSeconds() === 0 &&\n      date.getUTCMilliseconds() === 0\n    );\n  }\n\n  return (\n    date.getHours() === 0 &&\n    date.getMinutes() === 0 &&\n    date.getSeconds() === 0 &&\n    date.getMilliseconds() === 0\n  );\n}\n\nfunction extractDateParts(date: Date): { day: string; month: string; year: string } {\n  if (!(date instanceof Date) || Number.isNaN(date.getTime())) {\n    throw new Error(\"Date must be a valid Date object\");\n  }\n\n  const useLocalDate = isMidnight(date, \"local\") && !isMidnight(date, \"utc\");\n\n  if (useLocalDate) {\n    return {\n      day: date.getDate().toString().padStart(2, \"0\"),\n      month: (date.getMonth() + 1).toString().padStart(2, \"0\"),\n      year: date.getFullYear().toString().padStart(4, \"0\"),\n    };\n  }\n\n  const formattedDate = date.toISOString().split(\"T\")[0];\n  const [year, month, day] = formattedDate.split(\"-\");\n\n  return { day, month, year };\n}\n\nfunction reduceNumber(num: number): number {\n  if (num <= 16) {\n    return num;\n  }\n\n  return reduceNumber(\n    num\n      .toString()\n      .split(\"\")\n      .reduce((sum, digit) => sum + Number.parseInt(digit, 10), 0)\n  );\n}\n\n/**\n * Calculate the Odu numbers based on a date\n * @param date - Date object\n * @returns Odu numbers\n */\nexport function calculateOdu(date: Date): OduNumbers {\n  const { day, month, year } = extractDateParts(date);\n\n  // Split into left and right columns\n  const leftNumbers = [\n    Number.parseInt(day[0], 10),    // First digit of day\n    Number.parseInt(month[0], 10),  // First digit of month\n    Number.parseInt(year[0], 10),   // First digit of year\n    Number.parseInt(year[2], 10)    // Third digit of year\n  ];\n\n  const rightNumbers = [\n    Number.parseInt(day[1], 10),    // Second digit of day\n    Number.parseInt(month[1], 10),  // Second digit of month\n    Number.parseInt(year[1], 10),   // Second digit of year\n    Number.parseInt(year[3], 10)    // Fourth digit of year\n  ];\n\n  // Calculate initial sums\n  const rawLeftSum = leftNumbers.reduce((a, b) => a + b, 0);\n  const rawRightSum = rightNumbers.reduce((a, b) => a + b, 0);\n\n  // Calculate and reduce each direction\n  const north = reduceNumber(rawLeftSum);\n  const south = reduceNumber(rawRightSum);\n  const east = reduceNumber(north + south);\n  const west = reduceNumber(north + south + east);\n  const center = reduceNumber(north + south + east + west);\n\n  return {\n    leftNumbers,\n    rightNumbers,\n    north,\n    south,\n    east,\n    west,\n    center\n  };\n}\n"]}