package mutil

import (
	"context"

	"github.com/tech/sendico/pkg/db/repository"
	"github.com/tech/sendico/pkg/db/storable"
	"github.com/tech/sendico/pkg/mlogger"
	"github.com/tech/sendico/pkg/mutil/mzap"
	"go.mongodb.org/mongo-driver/v2/bson"
	"go.uber.org/zap"
)

func SetArchived[T storable.Storable](ctx context.Context, logger mlogger.Logger, newArchived bool, objectRef bson.ObjectID, repo repository.Repository) error {
	objs, err := GetObjects[T](ctx, logger, repository.IDFilter(objectRef), nil, repo)
	if err != nil {
		logger.Warn("Failed to fetch object", zap.Error(err), mzap.ObjRef("object_ref", objectRef))
		return err
	}

	if len(objs) == 0 {
		logger.Warn("No objects found to archive", mzap.ObjRef("object_ref", objectRef))
		return nil
	}

	// Archive the first object found
	obj := objs[0]
	if archivable, ok := any(obj).(interface{ SetArchived(bool) }); ok {
		archivable.SetArchived(newArchived)
		if err := repo.Update(ctx, obj); err != nil {
			logger.Warn("Failed to update object archived status", zap.Error(err), mzap.ObjRef("object_ref", objectRef))
			return err
		}
	}

	return nil
}
