package jobs

import (
	"context"
	"time"

	"github.com/treytartt/honeydue-api/internal/models"
	"github.com/treytartt/honeydue-api/internal/repositories"
)

// TaskRepo defines task query operations needed by job handlers.
type TaskRepo interface {
	GetOverdueTasks(now time.Time, opts repositories.TaskFilterOptions) ([]models.Task, error)
	GetDueSoonTasks(now time.Time, daysThreshold int, opts repositories.TaskFilterOptions) ([]models.Task, error)
	GetActiveTasksForUsers(now time.Time, opts repositories.TaskFilterOptions) ([]models.Task, error)
}

// ResidenceRepo defines residence query operations needed by job handlers.
type ResidenceRepo interface {
	FindResidenceIDsByUser(userID uint) ([]uint, error)
}

// ReminderRepo defines reminder log operations needed by job handlers.
type ReminderRepo interface {
	HasSentReminderBatch(keys []repositories.ReminderKey) (map[int]bool, error)
	LogReminder(taskID, userID uint, dueDate time.Time, stage models.ReminderStage, notificationID *uint) (*models.TaskReminderLog, error)
	CleanupOldLogs(daysOld int) (int64, error)
}

// NotificationRepo defines notification preference operations needed by job handlers.
type NotificationRepo interface {
	FindPreferencesByUser(userID uint) (*models.NotificationPreference, error)
	GetActiveTokensForUser(userID uint) ([]string, []string, error)
}

// NotificationSender creates and sends task notifications.
type NotificationSender interface {
	CreateAndSendTaskNotification(ctx context.Context, userID uint, notificationType models.NotificationType, task *models.Task) error
}

// PushSender sends push notifications to device tokens.
type PushSender interface {
	SendToAll(ctx context.Context, iosTokens, androidTokens []string, title, message string, data map[string]string) error
}

// EmailSender sends emails.
type EmailSender interface {
	SendEmail(to, subject, htmlBody, textBody string) error
}

// OnboardingEmailSender sends onboarding campaign emails.
type OnboardingEmailSender interface {
	CheckAndSendNoResidenceEmails() (int, error)
	CheckAndSendNoTasksEmails() (int, error)
}
