package backend

import (
	"context"
	"fmt"
	"os"
	"strings"

	"github.com/mem9-ai/drive9/pkg/datastore"
)

// HasConfirmedS3StorageRef checks the current tenant branch for an exact
// confirmed S3 object reference. The hash is used only as an indexed prefilter.
func (b *Dat9Backend) HasConfirmedS3StorageRef(ctx context.Context, storageRefHash, storageRef string) (bool, error) {
	if b == nil || b.store == nil {
		return false, fmt.Errorf("backend store is not configured")
	}
	reachable, err := b.store.HasConfirmedS3StorageRef(ctx, storageRefHash, storageRef)
	if err != nil || reachable || !strings.HasPrefix(storageRef, "layers/") {
		return reachable, err
	}
	return b.store.HasFSLayerStorageRef(ctx, storageRefHash, storageRef)
}

// DeleteS3ObjectForGC is the only exported physical S3 delete path for
// confirmed blob lifecycle cleanup.
func (b *Dat9Backend) DeleteS3ObjectForGC(ctx context.Context, storageRef string) error {
	return b.DeleteObjectForGC(ctx, storageRef, datastore.ContentLayoutSingle)
}

// DeleteObjectForGC routes a durable GC candidate to its recorded physical
// client instead of inferring a bucket from the object key.
func (b *Dat9Backend) DeleteObjectForGC(ctx context.Context, storageRef string, layout datastore.ContentLayout) error {
	if layout == datastore.ContentLayoutAppendLog {
		if b == nil || b.appendLogS3 == nil {
			return ErrAppendLogUnsupported
		}
		if storageRef == "" {
			return nil
		}
		if err := b.appendLogS3.DeleteObject(ctx, storageRef); err != nil && !os.IsNotExist(err) {
			return err
		}
		return nil
	}
	if b == nil || b.s3 == nil {
		return fmt.Errorf("s3 client is not configured")
	}
	if storageRef == "" {
		return nil
	}
	if err := b.s3.DeleteObject(ctx, storageRef); err != nil && !os.IsNotExist(err) {
		return err
	}
	return nil
}
