package types

import (
	clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
)

// 通过旁路上传后的文件的信息
type BypassedFileInfo struct {
	Path string
	Hash clitypes.FileHash
	Size int64
}

// 不通过ShardStore上传文件，但上传完成后需要通知ShardStore。
type BypassShardWrite interface {
	BypassedShard(info BypassedFileInfo) error
}

// 不通过PublicStore上传文件。
type BypassPublicWrite interface {
	BypassedPublic(info BypassedFileInfo, dstPath string) error
}

// 描述指定文件在分片存储中的路径。可以考虑设计成interface。
type BypassFilePath struct {
	Path string
	// 文件信息。此结构体中的字段不一定都会存在，比如如果是从BypassPublicRead接口获取的，那么Hash字段就为空。
	Info FileInfo
}

// 不通过ShardStore读取文件，但需要它返回文件的路径。
type BypassShardRead interface {
	BypassShardRead(fileHash clitypes.FileHash) (BypassFilePath, error)
}

// 不通过PublicStore读取文件。虽然仅使用path就已经可以读取到文件，但还是增加了此接口用于获取更详细的文件信息。
type BypassPublicRead interface {
	BypassPublicRead(path string) (BypassFilePath, error)
}

// 能通过一个Http请求直接访问文件
// 仅用于分片存储。
type HTTPBypassShardRead interface {
	HTTPBypassRead(fileHash clitypes.FileHash) (HTTPRequest, error)
}

type HTTPRequest struct {
	URL    string            `json:"url"`
	Method string            `json:"method"`
	Header map[string]string `json:"header"`
	Body   string            `json:"body"`
}
