package example

import (
	"context"
)

// ExaFile 文件实体
type ExaFile struct {
	ID           uint
	FileName     string
	FileMd5      string
	FilePath     string
	ChunkTotal   int
	IsFinish     bool
	ExaFileChunk []ExaFileChunk
}

// ExaFileChunk 文件切片实体
type ExaFileChunk struct {
	ID              uint
	ExaFileID       uint
	FileChunkNumber int
	FileChunkPath   string
}

// BreakpointContinueRepo 断点续传仓储接口
type BreakpointContinueRepo interface {
	FindOrCreateFile(ctx context.Context, fileMd5, fileName string, chunkTotal int) (*ExaFile, error)
	CreateFileChunk(ctx context.Context, fileID uint, fileChunkPath string, fileChunkNumber int) error
	DeleteFileChunk(ctx context.Context, fileMd5, filePath string) error
}

// BreakpointContinueUsecase 断点续传用例
type BreakpointContinueUsecase struct {
	repo BreakpointContinueRepo
}

// NewBreakpointContinueUsecase 创建断点续传用例
func NewBreakpointContinueUsecase(repo BreakpointContinueRepo) *BreakpointContinueUsecase {
	return &BreakpointContinueUsecase{repo: repo}
}

// FindOrCreateFile 查找或创建文件记录
func (uc *BreakpointContinueUsecase) FindOrCreateFile(ctx context.Context, fileMd5, fileName string, chunkTotal int) (*ExaFile, error) {
	return uc.repo.FindOrCreateFile(ctx, fileMd5, fileName, chunkTotal)
}

// CreateFileChunk 创建文件切片记录
func (uc *BreakpointContinueUsecase) CreateFileChunk(ctx context.Context, fileID uint, fileChunkPath string, fileChunkNumber int) error {
	return uc.repo.CreateFileChunk(ctx, fileID, fileChunkPath, fileChunkNumber)
}

// DeleteFileChunk 删除文件切片记录
func (uc *BreakpointContinueUsecase) DeleteFileChunk(ctx context.Context, fileMd5, filePath string) error {
	return uc.repo.DeleteFileChunk(ctx, fileMd5, filePath)
}
