package filer

import (
	"context"
	"fmt"
	"strings"

	"github.com/seaweedfs/seaweedfs/weed/util"
)

func (f *Filer) CanRename(ctx context.Context, source, target util.FullPath, oldName string) error {
	sourcePath := source.Child(oldName)
	if strings.HasPrefix(string(target), string(sourcePath)) {
		return fmt.Errorf("mv: can not move directory to a subdirectory of itself")
	}

	// Check if attempting to rename a bucket itself
	// Need to load the entry to check if it's a bucket
	entry, err := f.FindEntry(ctx, sourcePath)
	if err != nil {
		return err
	}
	if f.IsBucket(entry) {
		return fmt.Errorf("bucket renaming is not allowed")
	}

	sourceBucket := f.DetectBucket(source)
	targetBucket := f.DetectBucket(target)
	if sourceBucket != targetBucket {
		return fmt.Errorf("can not move across collection %s => %s", sourceBucket, targetBucket)
	}

	return nil
}

func (f *Filer) DetectBucket(source util.FullPath) (bucket string) {
	if strings.HasPrefix(string(source), f.DirBucketsPath+"/") {
		bucketAndObjectKey := string(source)[len(f.DirBucketsPath)+1:]
		t := strings.Index(bucketAndObjectKey, "/")
		if t < 0 {
			bucket = bucketAndObjectKey
		}
		if t > 0 {
			bucket = bucketAndObjectKey[:t]
		}
	}
	return bucket
}
