package port

import (
	"context"

	"{{GO_MODULE}}/services/{{COMPONENT_NAME}}/internal/domain"
)

// SessionRepository defines the interface for session persistence.
type SessionRepository interface {
	// Create persists a new session record.
	Create(ctx context.Context, session *domain.Session) error

	// Get returns a session by ID. Returns domain.ErrSessionNotFound if not found.
	Get(ctx context.Context, id domain.SessionID) (*domain.Session, error)

	// ListByUser returns all active (non-revoked) sessions for a user.
	ListByUser(ctx context.Context, userID domain.UserID) ([]domain.Session, error)

	// UpdateLastActive updates the last_active_at timestamp for a session.
	UpdateLastActive(ctx context.Context, id domain.SessionID) error

	// Revoke marks a session as revoked by setting revoked_at.
	Revoke(ctx context.Context, id domain.SessionID) error

	// RevokeAllForUser revokes all sessions for a user.
	// If exceptID is non-nil, that session is kept active.
	RevokeAllForUser(ctx context.Context, userID domain.UserID, exceptID *domain.SessionID) error

	// DeleteExpired removes sessions that have passed their expiry time.
	// Returns the number of sessions deleted.
	DeleteExpired(ctx context.Context) (int, error)
}
