package oss

import (
	"context"
	"fmt"
	"github.com/google/uuid"
	oss2 "legalgo-BE-go/internal/accessor/oss"
	"legalgo-BE-go/internal/domain/oss"
	"path"
	"strconv"
	"time"

	"github.com/go-playground/validator/v10"
)

type OssService struct {
	ossRepo oss2.OSSRepository
}

func NewOSSService(ossRepo oss2.OSSRepository) OSSService {
	return &OssService{
		ossRepo: ossRepo,
	}
}

func (s *OssService) UploadFile(ctx context.Context, req *oss.UploadFileRequest) (*oss.UploadFileResponse, error) {
	file := req.FileHeader
	req.FileSize = file.Size
	req.Ext = path.Ext(file.Filename)
	validate := validator.New()
	if err := validate.Struct(req); err != nil {
		return nil, err
	}

	// Open the file and read its content
	srcFile, err := file.Open()
	if err != nil {
		return nil, err
	}
	defer srcFile.Close()

	fileContent := make([]byte, file.Size)
	_, err = srcFile.Read(fileContent)
	if err != nil {
		return nil, err
	}

	filePath := fmt.Sprintf("%v/%v%v", req.FolderName, s.GenerateFileName(), req.Ext)
	fileUrl, err := s.ossRepo.UploadFile(ctx, filePath, fileContent)
	if err != nil {
		return nil, err
	}

	return &oss.UploadFileResponse{
		FilePath: filePath,
		FileUrl:  fileUrl,
	}, nil
}

func (s *OssService) GenerateFileName() string {
	return fmt.Sprintf("%v-%v", uuid.New(), strconv.Itoa(int(time.Now().Unix())))
}
