package repo

import (
	"assetcenter/conf"
	"assetcenter/db/model"
	"errors"
	"time"

	"go.mongodb.org/mongo-driver/bson/primitive"
)

type BoxtplRepo struct {
	Conf  *conf.AppAsset
	Model *model.Boxtpl
}

func (repo *BoxtplRepo) GetEntity() interface{} {
	return repo.Model
}

func (repo *BoxtplRepo) Upload(ctx *RepoSession, userId string) (interface{}, error) {
	asset := repo.Model
	if asset.File == nil || asset.File.Size < 1 || len(asset.File.Url) < 1 {
		return nil, errors.New("模型文件不能为空")
	}

	asset.CreateTime = time.Now()
	asset.UserId, _ = primitive.ObjectIDFromHex(userId)
	asset.UpdateTime = time.Now()
	asset.State = model.AssetState_Created

	collectionName := "asset-" + repo.Conf.Type

	assetId, err := RepoAddDoc(ctx, collectionName, asset)
	if err != nil {
		return nil, err
	}
	_, err = CreateMeshConvTask(ctx, asset.File, assetId, collectionName, userId)
	if err != nil { //模型转换失败,删除对应的模型
		RepoDeleteDoc(ctx, collectionName, assetId)
		return nil, err
	}

	// _, err = CreateShadowTask(ctx, asset.File, assetId, collectionName, userId)
	// if err != nil {
	// 	log.Error("CreateShadowTask err ", err)
	// 	fmt.Println("CreateShadowTask err ", err)
	// }
	return assetId, err
}

func (repo *BoxtplRepo) Update(ctx *RepoSession) (interface{}, error) {
	asset := repo.Model
	if len(asset.Id) < 1 {
		return nil, errors.New("id不能为空!")
	}
	id := asset.Id.Hex()
	asset.Id = primitive.NilObjectID
	asset.UpdateTime = time.Now()
	collectionName := "asset-" + repo.Conf.Type

	return RepoUpdateSetDoc(ctx, collectionName, id, asset)
}

func (repo *BoxtplRepo) Detail(ctx *RepoSession, id string) (interface{}, error) {
	collectionName := "asset-" + repo.Conf.Type
	ok, ret := RepoSeachDocMap(ctx, &DocSearchOptions{
		CollectName: collectionName,
		Query:       Map{"_id": id},
		Project:     []string{"name", "createTime", "updateTime", "state", "thumbnail", "categories", "osgjs", "file", "shadow", "type", "components"},
	})
	if !ok {
		return nil, errors.New("数据为空!")
	}
	return ret, nil
}