package comm

import (
	"time"

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

type RenderComponent struct {
	Name        string              `bson:"name,omitempty" json:"name"`
	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"`
	Card        *MaterialConf       `bson:"card,omitempty" json:"card"`
}

type RenderShoeComp struct {
	Name   string
	Config *RenderComponent
}

type RenderModelComp struct {
	Id         string              `bson:"id,omitempty" json:"id"`
	MeshId     *primitive.ObjectID `bson:"meshId,omitempty" json:"meshId,omitempty"`
	MeshUrl    string              `bson:"meshUrl,omitempty" json:"meshUrl,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 []*RenderShoeComp   `bson:"components,omitempty" json:"components,omitempty"`
}

const (
	TaskRunState_Created      = 0
	TaskRunState_Quened       = 1
	TaskRunState_WorkRuning   = 2
	TaskRunState_ReWorkRuning = 3
	TaskRunState_Succ         = 4
	TaskRunState_Fail         = 5
)

type TaskRunResult struct {
	Images []*OssType
}

type ConvMeshRunResult struct {
	Osgjs     *OssType
	Thumbnail *OssType
	File      *OssType
}

type RenderSceneLight struct {
	Type            string  `bson:"type,omitempty" json:"type"`
	Direction       Vect3   `bson:"direction,omitempty" json:"direction"`
	Color           Vect3   `bson:"color,omitempty" json:"color"`
	Intensity       float64 `bson:"intensity,omitempty" json:"intensity"`
	AngularDiameter float64 `bson:"angularDiameter,omitempty" json:"angularDiameter"`
}

type RenderTask struct {
	Id       primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	UserId   primitive.ObjectID `bson:"userId,omitempty" json:"userId"`
	DesignId primitive.ObjectID `bson:"designId" json:"designId"`
	WebId    int64              `bson:"webId" json:"webId"`

	RunState   int32          `bson:"runState" json:"runState"`
	RunPercent int32          `bson:"runPercent" json:"runPercent"`
	RunResult  *TaskRunResult `bson:"runResult" json:"runResult"`
	Width      int32          `bson:"width" json:"width"`
	Height     int32          `bson:"height" json:"height"`
	CreateTime time.Time      `bson:"createTime" json:"createTime"`

	Scene      *DesignScene        `bson:"scene" json:"scene"`
	MeshId     string              `bson:"meshId" json:"meshId"`
	MeshUrl    string              `bson:"meshUrl" json:"meshUrl"`
	MeshShadow string              `bson:"meshShadow" json:"meshShadow"`
	Cameras    []*RenderCamera     `bson:"cameras" json:"cameras"`
	Lights     []*RenderSceneLight `bson:"lights" json:"lights"`
	ShoeComps  []*RenderShoeComp   `bson:"shoeComps" json:"shoeComps"`
	ModelComps []*RenderModelComp  `bson:"modelComps" json:"modelComps"`

	MaxSamples int32   `bson:"maxSamples" json:"maxSamples"`
	Exposure   float32 `bson:"exposure" json:"exposure"`
	Format     string  `bson:"format" json:"format"` //渲染格式 png jpg
}

type TreeRenderTask struct {
	Id      primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	UserId  primitive.ObjectID `bson:"userId,omitempty" json:"userId"`
	AssetId primitive.ObjectID `bson:"assetId" json:"assetId"`

	RunState   int32          `bson:"runState" json:"runState"`
	RunPercent int32          `bson:"runPercent" json:"runPercent"`
	RunResult  *TaskRunResult `bson:"runResult" json:"runResult"`
	Width      int32          `bson:"width" json:"width"`
	Height     int32          `bson:"height" json:"height"`
	CreateTime time.Time      `bson:"createTime" json:"createTime"`

	Package *AssetPackage `bson:"pack" json:"pack"`
	SceneId string        `bson:"sceneId" json:"sceneId"`

	Lights           []*RenderSceneLight `bson:"lights" json:"lights"`
	Cameras          []*RenderCamera     `bson:"cameras" json:"cameras"`
	MaxSamples       int32               `bson:"maxSamples" json:"maxSamples"`
	Exposure         float32             `bson:"exposure" json:"exposure"`
	Format           string              `bson:"format" json:"format"`                     //渲染格式 png jpg
	DevicePixelRatio *float32            `bson:"devicePixelRatio" json:"devicePixelRatio"` //渲染格式 png jpg
}

type RenderSetting struct {
	MaxSamples int32   `bson:"maxSamples" json:"maxSamples"` //32
	Exposure   float32 `bson:"exposure" json:"exposure"`     //1.2
}

type RenderCamera struct {
	Thumbnail   *OssType       `bson:"thumbnail" json:"thumbnail,omitempty"` //
	Position    *Vec3Obj       `bson:"position" json:"position,omitempty"`   //
	Fov         float32        `bson:"fov" json:"fov"`                       //45
	Direction   *Vec3Obj       `bson:"direction" json:"direction,omitempty"`
	Viewport    CameraViewPort `bson:"viewport" json:"viewport"`
	AspectRatio *float32       `bson:"aspectRatio" json:"aspectRatio,omitempty"`
}

type CameraViewPort struct {
	Width  int32 `bson:"width" json:"width"`
	Height int32 `bson:"height" json:"height"`
}

type SunLight struct {
	Type            string  `bson:"type" json:"type"`
	Intensity       float32 `bson:"intensity" json:"intensity"`
	Direction       Vec3Obj `bson:"direction" json:"direction"`
	AngularDiameter float32 `bson:"angularDiameter" json:"angularDiameter"`
	Color           Vect3   `bson:"color" json:"color"`
}

type RenderEnv struct {
	Color     Vect3   `bson:"color" json:"color"`
	Rotation  float32 `bson:"rotation" json:"rotation"`
	Intensity float32 `bson:"intensity" json:"intensity"`
	FilePath  string  `bson:"filePath" json:"filePath"`
	Visiable  bool    `bson:"visiable" json:"visiable"`
}

type Vec3Obj struct {
	X float64 `bson:"x" json:"x"`
	Y float64 `bson:"y" json:"y"`
	Z float64 `bson:"z" json:"z"`
}
type Vec4Obj struct {
	X float64 `bson:"x" json:"x"`
	Y float64 `bson:"y" json:"y"`
	Z float64 `bson:"z" json:"z"`
	W float64 `bson:"w" json:"w"`
}

type RenderMatParam struct {
	Name  string      `bson:"name" json:"name"`
	Type  string      `bson:"type" json:"type"`
	Value interface{} `bson:"value" json:"value,omitempty"`
}

type RenderMat struct {
	Name         string            `bson:"name" json:"name"`
	Type         string            `bson:"type" json:"type"`
	UVProjection string            `bson:"uvProjection" json:"uvProjection"` //"box", "uv"
	Parameters   []*RenderMatParam `bson:"parameters" json:"parameters"`
}

type RenderGroup struct {
	Name      string       `bson:"name" json:"name"`
	Position  Vec3Obj      `bson:"position" json:"position"`
	Rotation  Vec4Obj      `bson:"rotation" json:"rotation"`
	Scale     Vec3Obj      `bson:"scale" json:"scale"`
	Materials []*RenderMat `bson:"materials" json:"materials"`
	FilePath  string       `bson:"filePath" json:"filePath"`
}

type RenderConf struct {
	Setting    *RenderSetting      `bson:"setting" json:"setting"`
	Camera     *RenderCamera       `bson:"camera" json:"camera"`
	Lights     []*RenderSceneLight `bson:"lights" json:"lights"`
	Enviroment *RenderEnv          `bson:"enviroment" json:"enviroment"`
	Groups     []*RenderGroup      `bson:"groups" json:"groups"`
	Shadow     *Shadow             `bson:"shadow" json:"shadow"`
}

type WorkerRequest struct {
	Name           string    `json:"name"`
	UserId         string    `json:"userId"`
	SessionId      int64     `json:"sessionId"`
	TaskId         string    `json:"taskId"`
	MainId         string    `json:"mainId"`
	TaskCollection string    `json:"taskCollection"`
	WorkerType     string    `json:"workerType"`
	CreateTime     time.Time `json:"createTime"`
}

type WorkerResponse struct {
	ErrorNo   int    `json:"errorNo"`
	ErrorDesc string `json:"errorDesc"`
	Result    struct {
		WorkingId string `json:"workingId"`
	} `json:"result"`
}

type Shadow struct {
	Size     *Vect2 `bson:"size,omitempty" json:"size,omitempty"`
	Position *Vect3 `bson:"position,omitempty" json:"position,omitempty"`
	File     string `bson:"file,omitempty" json:"file,omitempty"`
}
