// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: AGPL-3.0-or-later

package lunatask

import "time"

// TaskFilterOptions configures task list filtering.
type TaskFilterOptions struct {
	AreaID           *string
	GoalID           *string
	Status           *TaskStatus
	IncludeCompleted bool      // If false, excludes completed tasks older than Today
	Today            time.Time // Reference date for "old completed" check
}

// FilterTasks returns tasks matching the given filter options.
// If opts is nil, returns all tasks unchanged.
func FilterTasks(tasks []Task, opts *TaskFilterOptions) []Task {
	if opts == nil {
		return tasks
	}

	filtered := make([]Task, 0, len(tasks))

	for _, task := range tasks {
		if matchesFilter(task, opts) {
			filtered = append(filtered, task)
		}
	}

	return filtered
}

func matchesFilter(task Task, opts *TaskFilterOptions) bool {
	if !matchesAreaFilter(task, opts.AreaID) {
		return false
	}

	if !matchesGoalFilter(task, opts.GoalID) {
		return false
	}

	if !matchesStatusFilter(task, opts.Status) {
		return false
	}

	if !opts.IncludeCompleted && opts.Status == nil && IsOldCompleted(task, opts.Today) {
		return false
	}

	return true
}

func matchesAreaFilter(task Task, areaID *string) bool {
	if areaID == nil {
		return true
	}

	return task.AreaID != nil && *task.AreaID == *areaID
}

func matchesGoalFilter(task Task, goalID *string) bool {
	if goalID == nil {
		return true
	}

	return task.GoalID != nil && *task.GoalID == *goalID
}

func matchesStatusFilter(task Task, status *TaskStatus) bool {
	if status == nil {
		return true
	}

	return task.Status != nil && *task.Status == *status
}

// IsOldCompleted returns true if the task was completed before the given date.
// Returns false for non-completed tasks or tasks with no CompletedAt timestamp.
func IsOldCompleted(task Task, today time.Time) bool {
	if task.Status == nil || *task.Status != StatusCompleted {
		return false
	}

	return task.CompletedAt == nil || task.CompletedAt.Before(today)
}
