package types

import (
	"errors"

	"gitlink.org.cn/cloudream/common/pkgs/async"
)

var ErrStorageNotFound = errors.New("storage not found")

// 不支持的操作。可以作为StorageBuilder中任意函数的错误返回值，代表该操作不被支持。
var ErrUnsupported = errors.New("unsupported operation")

var ErrStorageExists = errors.New("storage already exists")

type StorageEvent interface{}

type StorageEventChan = async.UnboundChannel[StorageEvent]

type StorageBuilder interface {
	// 关于此存储系统特性功能的描述
	FeatureDesc() FeatureDesc
	// 创建一个分片存储组件
	CreateShardStore() (ShardStore, error)
	// 创建一个公共存储组件
	CreatePublicStore() (PublicStore, error)
	// 创建一个分片上传组件
	CreateMultiparter() (Multiparter, error)
	// 创建一个存储服务直传组件
	CreateS2STransfer() (S2STransfer, error)
	CreateECMultiplier() (ECMultiplier, error)
}

type FeatureDesc struct {
	// 是否能旁路上传分片
	HasBypassShardWrite bool
	// 是否能旁路上传公共存储
	HasBypassPublicWrite bool
	// 是否能旁路读取分片
	HasBypassShardRead bool
	// 公共存储是否支持旁路读取
	HasBypassPublicRead bool
	// 是否能通过HTTP读取
	HasBypassHTTPRead bool
}
