File size: 1,549 Bytes
cf86710
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import {
  differenceInDays,
  type GetWeekOptions,
  getWeek as getWeekFns,
} from "date-fns";

import { toEthiopicDate, toGregorianDate } from "../utils/index.js";

import { startOfWeek } from "./startOfWeek.js";

/**
 * Get week number for Ethiopian calendar
 *
 * @param {Date} date - The original date
 * @param {GetWeekOptions} [options] - The options object
 * @returns {number} The week number
 */
export function getWeek(date: Date, options?: GetWeekOptions): number {
  const weekStartsOn = options?.weekStartsOn ?? 1; // Default to Monday (1)
  const etDate = toEthiopicDate(date);
  const currentWeekStart = startOfWeek(date, { weekStartsOn });

  // Get the first day of the current year
  const firstDayOfYear = toGregorianDate({
    year: etDate.year,
    month: 1,
    day: 1,
  });

  const firstWeekStart = startOfWeek(firstDayOfYear, { weekStartsOn });

  // If date is before the first week of its year
  if (date < firstWeekStart) {
    return getWeekFns(date, { weekStartsOn, firstWeekContainsDate: 1 });
  }

  // If date falls into the first week of the NEXT Ethiopic year, return 1
  const nextYearFirstDay = toGregorianDate({
    year: etDate.year + 1,
    month: 1,
    day: 1,
  });
  const nextYearFirstWeekStart = startOfWeek(nextYearFirstDay, {
    weekStartsOn,
  });
  if (date >= nextYearFirstWeekStart) {
    return 1;
  }

  // Calculate week number based on days since first week
  const daysSinceFirstWeek = differenceInDays(currentWeekStart, firstWeekStart);
  return Math.floor(daysSinceFirstWeek / 7) + 1;
}