package comm

import (
	"time"

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

const (
	MeshState_SetFile         = 0  //create
	MeshState_SetOsgjs        = 1  //模型转换到osgjs了,可以用于webgl显示了
	MeshState_SetOsgjsFailded = -1 //模型转换到osgjs了,可以用于webgl显示了
	MeshState_SetShadow       = 2  //阴影已生成
)

type Evn3dOption struct {
	Rotation float64 `bson:"rotation" json:"rotation"`
	Exposure float64 `bson:"exposure" json:"exposure"`
}

type DesingSceneEnv3d struct {
	Id        primitive.ObjectID `bson:"id,omitempty" json:"id"`
	Name      string             `bson:"name,omitempty" json:"name"`
	Thumbnail *OssType           `bson:"thumbnail,omitempty" json:"thumbnail"`
	HDR       *OssType           `bson:"hdr,omitempty" json:"hdr"`
	Config    *Evn3dHdrConf      `bson:"config,omitempty" json:"config"`

	Options *Evn3dOption `bson:"options,omitempty" json:"options"`
	ToneMap *ToneMap     `bson:"toneMap,omitempty" json:"toneMap"`
}

type Uvtransform struct {
	Scale      float32 `bson:"scale" json:"scale"`
	Rotate     float32 `bson:"rotate" json:"rotate"`
	OffsetX    float32 `bson:"offsetX" json:"offsetX"`
	OffsetY    float32 `bson:"offsetY" json:"offsetY"`
	FinalScale float32 `bson:"finalScale" json:"finalScale"`
}

type ImageMatConf struct {
	Image *OssType           `bson:"image,omitempty" json:"image"`
	Id    primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
}

type SceneComponent struct {
	Name        string              `bson:"name,omitempty" json:"name"`
	FabricScope string              `bson:"fabricScope,omitempty" json:"fabricScope,omitempty"` //面料使用的库
	FabricId    *primitive.ObjectID `bson:"fabricId,omitempty" json:"fabricId,omitempty"`
	CardId      *primitive.ObjectID `bson:"cardId,omitempty" json:"cardId,omitempty"`
	MatType     uint8               `bson:"matType,omitempty" json:"matType"`
	Imagemat    *ImageMatConf       `bson:"imageMat,omitempty" json:"imageMat,omitempty"`
	Uvtransform *Uvtransform        `bson:"transform,omitempty" json:"transform"`
	Color       *Vect3              `bson:"color,omitempty" json:"color"`
	GroupId     uint64              `bson:"groupId,omitempty" json:"groupId"`
	Visible     *bool               `bson:"visible,omitempty" json:"visible"`
}

type SceneBackground struct {
	Id    string   `bson:"_id,omitempty" json:"_id"`
	Image *OssType `bson:"image,omitempty" json:"image"`
	Type  int32    `bson:"type,omitempty" json:"type"`
	Color *Vect3   `bson:"color,omitempty" json:"color"`
}

type ModelTransform struct {
	Pos      Vect3 `bson:"pos,omitempty" json:"pos"`
	Scale    Vect3 `bson:"scale,omitempty" json:"scale"`
	Rotation Vect4 `bson:"rotation,omitempty" json:"rotation"`
}

type SceneModels struct {
	Id         string              `bson:"id,omitempty" json:"id"`
	MeshId     *primitive.ObjectID `bson:"meshId,omitempty" json:"meshId,omitempty"`
	Mesh       *DesignMesh         `bson:"mesh,omitempty" json:"mesh,omitempty"`
	Type       string              `bson:"type,omitempty" json:"type"`
	TypeId     *primitive.ObjectID `bson:"typeId,omitempty" json:"typeId,omitempty"`
	Transform  ModelTransform      `bson:"transform,omitempty" json:"transform,omitempty"`
	Components []*SceneComponent   `bson:"components,omitempty" json:"components,omitempty"`
}

type SceneCamera struct {
	Id       string `bson:"id,omitempty" json:"id"`
	Position *Vect3 `bson:"position,omitempty" json:"position"`
	Target   *Vect3 `bson:"target,omitempty" json:"target"`
	Enable   *bool  `bson:"enable,omitempty" json:"enable"`
}

type Matrix [16]float64
type Light struct {
	Id        string  `bson:"id,omitempty" json:"id"`
	Type      string  `bson:"type,omitempty" json:"type"`
	Enable    bool    `bson:"enable,omitempty" json:"enable"`
	Matrix    Matrix  `bson:"matrix,omitempty" json:"matrix"`
	Color     Vect3   `bson:"color,omitempty" json:"color"`
	Intensity float64 `bson:"intensity,omitempty" json:"intensity"`
}

type SceneLight struct {
	Enable bool     `bson:"enable,omitempty" json:"enable"`
	List   []*Light `bson:"list,omitempty" json:"list"`
}

type DesignScene struct {
	Id         uint64            `bson:"id,omitempty" json:"id,omitempty"`
	Name       string            `bson:"name,omitempty" json:"name,omitempty"`
	Thumbnail  *OssType          `bson:"thumbnail,omitempty" json:"thumbnail,omitempty"`
	Images     []*OssType        `bson:"images,omitempty" json:"images,omitempty"`
	Videos     []*OssType        `bson:"videos,omitempty" json:"videos,omitempty"`
	Locks      []string          `bson:"locks,omitempty" json:"locks,omitempty"`
	Background *SceneBackground  `bson:"background,omitempty" json:"background,omitempty"`
	Env        *DesingSceneEnv3d `bson:"env,omitempty" json:"env,omitempty"`
	Components []*SceneComponent `bson:"components,omitempty" json:"components,omitempty"`
	Models     []*SceneModels    `bson:"models,omitempty" json:"models,omitempty"`
	Stickers   []*Sticker        `bson:"stickers,omitempty" json:"stickers,omitempty"`
	Lights     *SceneLight       `bson:"lights,omitempty" json:"lights,omitempty"`
}

type Design struct {
	Id         primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	Mesh       *DesignMesh        `bson:"mesh,omitempty" json:"mesh"`
	Name       string             `bson:"name,omitempty" json:"name"`
	Thumbnail  *OssType           `bson:"thumbnail,omitempty" json:"thumbnail"`
	CreateTime time.Time          `bson:"createTime,omitempty" json:"createTime"`
	Scenes     []*DesignScene     `bson:"scenes,omitempty" json:"scenes"`
}

type Sticker struct {
	Id       string                 `bson:"id,omitempty" json:"id,omitempty"`
	Img      *OssType               `bson:"img,omitempty" json:"img,omitempty"`
	Scale    *Vect2                 `bson:"scale,omitempty" json:"scale,omitempty"`
	Visible  *bool                  `bson:"visible,omitempty" json:"visible,omitempty"`
	Rotation float32                `bson:"rotation" json:"rotation"`
	Mirror   *Vect2                 `bson:"mirror,omitempty" json:"mirror,omitempty"`
	Anchors  []*Vect2               `bson:"anchors,omitempty" json:"anchors,omitempty"`
	Config   map[string]interface{} `bson:"config,omitempty" json:"config,omitempty"`
}