package storage

import (
	"context"
	"fmt"
	"io"
	"os"
	"time"
)

// StorageType 存储类型
type StorageType string

const (
	StorageTypeLocal StorageType = "local"
	StorageTypeS3    StorageType = "s3"
	StorageTypeOSS   StorageType = "oss"
	StorageTypeCOS   StorageType = "cos"
)

// StorageConfig 存储配置接口
type StorageConfig interface {
	GetType() StorageType
	Validate() error
}

// Storage 存储接口
type Storage interface {
	CreateFile(ctx context.Context, path string) (File, error)
	// Delete 删除文件
	Delete(ctx context.Context, path string) error

	// Exists 检查文件是否存在
	Exists(ctx context.Context, path string) (bool, error)

	// GetSize 获取文件大小
	GetSize(ctx context.Context, path string) (int64, error)

	// GetURL 获取文件访问URL
	GetURL(ctx context.Context, path string) (string, error)

	// List 列出文件
	List(ctx context.Context, prefix string) ([]FileInfo, error)

	// Close 关闭存储连接
	Close() error
}

// Writer 写入器接口
type Writer interface {
	io.Writer
	io.WriterAt
	io.Closer

	// Sync 同步到存储
	Sync() error

	// Seek 设置写入位置
	Seek(offset int64, whence int) (int64, error)
}

// Reader 读取器接口
type Reader interface {
	io.Reader
	io.ReaderAt
	io.Closer
	io.Seeker
}

type File interface {
	Writer
	Reader
	Stat() (os.FileInfo, error)
	Name() string
}

// FileInfo 文件信息
type FileInfo struct {
	Name         string    `json:"name"`
	Size         int64     `json:"size"`
	LastModified time.Time `json:"last_modified"`
	ETag         string    `json:"etag,omitempty"`
	ContentType  string    `json:"content_type,omitempty"`
}

// CreateStorage 创建存储实例的便捷函数
func CreateStorage(t string, config any) (Storage, error) {
	factory, exists := Factory[t]
	if !exists {
		return nil, ErrUnsupportedStorageType
	}
	return factory(config)
}

// 错误定义
var (
	ErrUnsupportedStorageType = fmt.Errorf("unsupported storage type")
	ErrFileNotFound           = fmt.Errorf("file not found")
	ErrStorageNotAvailable    = fmt.Errorf("storage not available")
)
