package biz

import (
	"context"
	"fm-upload/internal/data/model"
	"fm-upload/internal/data/model/request"
	"fmt"
	"io"
	"mime/multipart"
	"os"
	"time"

	"github.com/go-kratos/kratos/v2/log"
)

const (
	resumeLimit = 1023 * 1048576
	chunkSize   = 300 * 1048576
)

// GreeterRepo is a Greater repo.
type StorageRepo interface {
	SaveToHw(context.Context, []byte, string, string) (*model.MyPutRet, error)
	SaveFileToHw(context.Context, string, string, string) (*model.MyPutRet, error)
}

// GreeterUsecase is a Greeter usecase.
type StorageUsecase struct {
	repo StorageRepo
	log  *log.Helper
}

// NewGreeterUsecase new a Greeter usecase.
func NewStorageUsecase(repo StorageRepo, logger log.Logger) *StorageUsecase {
	return &StorageUsecase{repo: repo, log: log.NewHelper(logger)}
}

func (uc *StorageUsecase) UploadToServer(ctx context.Context, oName string, resData request.UploadResponse, key string, fileH *multipart.FileHeader, bucket string) (*request.UploadResponse, error) {
	t1 := time.Now()
	var (
		err error
		ret *model.MyPutRet
	)
	if fileH.Size > resumeLimit {
		file, _ := fileH.Open()
		defer file.Close()
		var testLocalFile *os.File
		fileN := "/tmp/" + key[len(key)-20:]
		testLocalFile, err = os.CreateTemp("/tmp", key[len(key)-20:])
		if err != nil {
			return nil, err
		}
		defer os.Remove(fileN)
		io.Copy(testLocalFile, file)
		// _, err = HwUploadFilePartToServer(fileN, key, bucket)
	} else {
		file, _ := fileH.Open()
		defer file.Close()
		fileByte, _ := io.ReadAll(file)
		ret, err = uc.repo.SaveToHw(ctx, fileByte, key, bucket)
	}
	if err != nil {
		return nil, err
	}
	if err != nil {
		return nil, err
	}
	resData.Time1 = fmt.Sprintf("%.3f", time.Since(t1).Seconds())
	resData.File = ret.ReturnPrefix + key
	return &resData, nil
}