import type { GoalFrequency } from "./Goal" import type { Habit } from "./Habit" import { HabitHistory } from "./HabitHistory" import { HabitProgress } from "./HabitProgress" export interface HabitsTrackerData { habitsHistory: { [key in GoalFrequency]: HabitHistory[] } } export class HabitsTracker implements HabitsTrackerData { public habitsHistory: HabitsTrackerData["habitsHistory"] public constructor(options: HabitsTrackerData) { const { habitsHistory } = options this.habitsHistory = habitsHistory } public static default(): HabitsTracker { return new HabitsTracker({ habitsHistory: { daily: [], weekly: [], monthly: [], }, }) } public addHabit(habit: Habit): void { this.habitsHistory[habit.goal.frequency].push( new HabitHistory({ habit, progressHistory: [], }), ) } public setHabitProgress(options: SetHabitProgressOptions): void { const { date, goalProgress, habitHistory } = options if (goalProgress.isBoolean()) { const currentHabitProgress = habitHistory.getProgressesByDate(date)[0] if (currentHabitProgress == null) { habitHistory.progressHistory = [ ...habitHistory.progressHistory, new HabitProgress({ date, goalProgress, habitId, id, }), ] } } } public getAllHabitsHistory(): HabitHistory[] { return [ ...this.habitsHistory.daily, ...this.habitsHistory.weekly, ...this.habitsHistory.monthly, ] } public getHabitHistoryById(id: Habit["id"]): HabitHistory | undefined { return this.getAllHabitsHistory().find((habitHistory) => { return habitHistory.habit.id === id }) } }