package comm

import (
	"time"

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

type DesignProduct struct { //设计单品信息
	Id              primitive.ObjectID `bson:"_id,omitempty" json:"_id"`
	ProjectId       primitive.ObjectID `bson:"projectId,omitempty" json:"projectId"`
	FromDbConfId    string             `bson:"fromDbConfId,omitempty" json:"fromDbConfId"` //数据库定义Id
	FromAssetConfId string             `bson:"fromAssetConfId,omitempty" json:"fromAssetConfId"`
	FromId          string             `bson:"fromId,omitempty" json:"fromId"`
	Name            string             `bson:"name,omitempty"  json:"name"`
	Thumbnail       *OssType           `bson:"thumbnail,omitempty"  json:"thumbnail"`

	StaticMesh *StaticMeshSource `bson:"staticMesh,omitempty" json:"staticMesh"` //静态模型资产
	UpdateTime time.Time         `bson:"updateTime,omitempty"  json:"updateTime"`
}

type ProductHeader struct {
	Id              string    `bson:"id,omitempty"  json:"id"`
	FromDbConfId    string    `bson:"fromDbConfId,omitempty" json:"fromDbConfId"`       //数据库定义Id
	FromAssetConfId string    `bson:"fromAssetConfId,omitempty" json:"fromAssetConfId"` //数据包
	FromId          string    `bson:"fromId,omitempty" json:"fromId"`
	Name            string    `bson:"name,omitempty"  json:"name"`
	Thumbnail       *OssType  `bson:"thumbnail,omitempty"  json:"thumbnail"`
	CreateTime      time.Time `bson:"createTime,omitempty"  json:"createTime"`
}

type PackageProductCompMat struct {
	Id      string   `bson:"id" json:"id"`
	UvMap   *OssType `bson:"uvmap" json:"uvmap"`
	UvSize  *UvSize  `bson:"uvsize" json:"uvsize"`
	Name    string   `bson:"name" json:"name"`
	MatId   string   `bson:"matId" json:"matId"`
	GroupId string   `bson:"groupId" json:"groupId"` //部件分组Id
	Index   int      `bson:"index" json:"index"`
	Visible *bool    `bson:"visible" json:"visible"`
	Locked  *bool    `bson:"locked" json:"locked"` //是否锁定

	Images     []*ComponentImage `bson:"images" json:"images"`
	PaperMatId string            `bson:"paperMatId" json:"paperMatId"`                 //纸张id
	UserData   interface{}       `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
}

type PackageProduct struct {
	Id         string                   `bson:"id,omitempty" json:"id"`
	GeomId     string                   `bson:"geomId,omitempty" json:"geomId"`
	Name       string                   `bson:"name,omitempty" json:"name"`
	CusNum     string                   `bson:"cusNum,omitempty" json:"cusNum,omitempty"`
	Type       string                   `bson:"type,omitempty" json:"type,omitempty"` //类型
	Thumbnail  *OssType                 `bson:"thumbnail,omitempty" json:"thumbnail"`
	Components []*PackageProductCompMat `bson:"components,omitempty" json:"components"`
	UserData   interface{}              `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
}

func (p *PackageProduct) UpdateSourceUrl(handler UpdateUrlHandler) {
	if p.Thumbnail != nil {
		p.Thumbnail.UpdateSourceUrl(handler)
	}
	for _, c := range p.Components {
		if c.UvMap != nil {
			c.UvMap.UpdateSourceUrl(handler)
		}
	}
}

type PackageGeom struct {
	Id          string   `bson:"id,omitempty" json:"id"`
	Name        string   `bson:"name,omitempty" json:"name"`
	Thumbnail   *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
	Osgjs       *OssType `bson:"osgjs,omitempty" json:"osgjs"`
	File        *OssType `bson:"file,omitempty" json:"file"` //hdr or fbx
	Glb         *OssType `bson:"glb,omitempty" json:"glb"`   //hdr or fbx
	Shadow      *OssType `bson:"shadow,omitempty" json:"shadow,omitempty"`
	BoundingBox *Obb     `bson:"boundingBox,omitempty" json:"boundingBox,omitempty"`

	GenType string      `bson:"genType,omitempty" json:"genType,omitempty"` //生成方式构建类型staticMesh, paramBox //默认staticMesh类型
	GenConf interface{} `bson:"genConf,omitempty" json:"genConf,omitempty"` //构建配置
}

func (g *PackageGeom) UpdateSourceUrl(handler UpdateUrlHandler) {
	if g.Thumbnail != nil {
		g.Thumbnail.UpdateSourceUrl(handler)
	}
	if g.Osgjs != nil {
		g.Osgjs.UpdateSourceUrl(handler)
	}
	if g.File != nil {
		g.File.UpdateSourceUrl(handler)
	}
	if g.Glb != nil {
		g.Glb.UpdateSourceUrl(handler)
	}
	if g.Shadow != nil {
		g.Shadow.UpdateSourceUrl(handler)
	}
}

type PackageSceneProduct struct {
	Id        string          `bson:"id,omitempty" json:"id"`
	ProdId    string          `bson:"prodId,omitempty" json:"prodId"`
	Transform *ModelTransform `bson:"transform,omitempty" json:"transform,omitempty"`
	Visible   *bool           `bson:"visible,omitempty" json:"visible,omitempty"`
	NoShadow  *bool           `bson:"noShadow,omitempty" json:"noShadow,omitempty"` //是否不显示阴影
	UserData  interface{}     `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
}

type PackageScene struct {
	Id         string                 `bson:"id,omitempty" json:"id,omitempty"`
	Name       string                 `bson:"name,omitempty" json:"name,omitempty"`
	Thumbnail  *OssType               `bson:"thumbnail,omitempty" json:"thumbnail,omitempty"`
	EnvId      string                 `bson:"envId,omitempty" json:"envId,omitempty"`
	Products   []*PackageSceneProduct `bson:"products,omitempty" json:"products,omitempty"`
	Lights     *SceneLight            `bson:"lights,omitempty" json:"lights,omitempty"`
	Stickers   []*PackSceneSticker    `bson:"stickers,omitempty" json:"stickers,omitempty"`
	CreateTime time.Time              `bson:"createTime,omitempty"  json:"createTime"`
	UpdateTime time.Time              `bson:"updateTime,omitempty"  json:"updateTime"`
	Background *Evn3dBackground       `bson:"background,omitempty"  json:"background"`      //添加背景配置
	UserData   interface{}            `bson:"userData,omitempty" json:"userData,omitempty"` //自定义数据
}

func (s *PackageScene) UpdateSourceUrl(handler UpdateUrlHandler) {
	if s.Thumbnail != nil {
		s.Thumbnail.UpdateSourceUrl(handler)
	}
	for _, tiker := range s.Stickers {
		if tiker.Img != nil {
			tiker.Img.UpdateSourceUrl(handler)
		}
	}
	if s.Background != nil && s.Background.Image != nil {
		s.Background.Image.UpdateSourceUrl(handler)
	}
}

type PositionObj2d struct {
	X int `bson:"x,omitempty"  json:"x"`
	Y int `bson:"y,omitempty"  json:"y"`
}

type PackSceneSticker struct {
	Id       string        `bson:"id,omitempty"  json:"id"`
	Config   interface{}   `bson:"config,omitempty"  json:"config"`
	Img      *OssType      `bson:"img,omitempty"  json:"img"`
	Mirror   []int         `bson:"mirror,omitempty"  json:"mirror"`
	Position PositionObj2d `bson:"position,omitempty"  json:"position"`
	Rotation int           `bson:"rotation,omitempty"  json:"rotation"`
	Scale    []float32     `bson:"scale,omitempty"  json:"scale"`
	Visible  *bool         `bson:"visible,omitempty"  json:"visible"`
}

type PackageEnv3d struct {
	Id         string           `bson:"id,omitempty" json:"id"`
	Name       string           `bson:"name,omitempty" json:"name"`
	CusNum     string           `bson:"cusNum,omitempty" json:"cusNum"` //自定义编号
	Thumbnail  *OssType         `bson:"thumbnail,omitempty" json:"thumbnail"`
	CreateTime time.Time        `bson:"createTime,omitempty" json:"createTime"`
	HDR        *OssType         `bson:"hdr,omitempty" json:"hdr"`
	Config     *Evn3dHdrConf    `bson:"config,omitempty" json:"config"`
	Options    *Env3dOption     `bson:"options,omitempty" json:"options"`
	ToneMap    *ToneMap         `bson:"toneMap,omitempty" json:"toneMap"`
	Background *Evn3dBackground `bson:"background,omitempty" json:"background"`

	UserData interface{} `bson:"userData,omitempty" json:"userData"` //用户数据
}

func (e *PackageEnv3d) UpdateSourceUrl(handler UpdateUrlHandler) {
	if e.Thumbnail != nil {
		e.Thumbnail.UpdateSourceUrl(handler)
	}
	if e.HDR != nil {
		e.HDR.UpdateSourceUrl(handler)
	}
	if e.Config != nil {
		e.Config.UpdateSourceUrl(handler)
	}
	if e.Background != nil && e.Background.Image != nil {
		e.Background.Image.UpdateSourceUrl(handler)
	}
}

type PackageMaterial struct {
	Id        string   `bson:"id,omitempty" json:"id"`
	Thumbnail *OssType `bson:"thumbnail,omitempty" json:"thumbnail"`
	Name      string   `bson:"name,omitempty" json:"name"`
	CusNum    string   `bson:"cusNum,omitempty" json:"cusNum"` //编号

	NormalMap      *OssType `bson:"normalMap,omitempty" json:"normalMap"`
	DisplaceMap    *OssType `bson:"displaceMap,omitempty" json:"displaceMap"` //置换贴图
	DisplaceFactor *float64 `bson:"displaceFactor,omitempty" json:"displaceFactor"`
	BaseMap        *OssType `bson:"baseMap,omitempty" json:"baseMap"`
	BaseColor      *Vect3   `bson:"baseColor,omitempty" json:"baseColor"`
	RoughMap       *OssType `bson:"roughMap,omitempty" json:"roughMap"`
	RoughFactor    *float64 `bson:"roughFactor,omitempty" json:"roughFactor"`
	MetalMap       *OssType `bson:"metalMap,omitempty" json:"metalMap"`
	MetalFactor    *float64 `bson:"metalFactor,omitempty" json:"metalFactor"`

	DiffuseMap   *OssType `bson:"diffuseMap,omitempty" json:"diffuseMap"`
	DiffuseColor *Vect3   `bson:"diffuseColor,omitempty" json:"diffuseColor"`
	GlossMap     *OssType `bson:"glossMap,omitempty" json:"glossMap"` //光泽贴图
	GlossFactor  *float64 `bson:"glossFactor,omitempty" json:"glossFactor"`
	SpecMap      *OssType `bson:"specMap,omitempty" json:"specMap"`     //高光贴图
	SpecColor    *Vect3   `bson:"specColor,omitempty" json:"specColor"` //高光贴图

	//工艺相关材质球
	TechMaterial *TechMatConfig    `bson:"techMaterial" json:"techMaterial"`
	Images       []*ComponentImage `bson:"images" json:"images"`

	OpacMap    *OssType `bson:"opacMap,omitempty" json:"opacMap"`       //透明度
	OpacFactor *float64 `bson:"opacFactor,omitempty" json:"opacFactor"` //透明度贴图

	Type string `bson:"type,omitempty" json:"type"` //spec meta  //高光流 金属流(默认)

	Uvtransform *MaterailUv `bson:"uv,omitempty" json:"uv"`

	CusUvTransform *MaterailUv `bson:"cusUv,omitempty" json:"cusUv"` //用户定义的uv
	//LogicType      string      `bson:"logicType,omitempty" json:"logicType"` //fabric3d fabric2d color //3d面料 2d图片面料 color //特殊材质球
	UvMap    string      `bson:"uvMap,omitempty" json:"uvMap"`       //uv的映射方式 box 或 uv 默认box
	UserData interface{} `bson:"userData,omitempty" json:"userData"` //指定要数据放置的字段
}

func (m *PackageMaterial) CopyFromMatConf(c *MaterialConf) {
	m.Thumbnail = c.Thumbnail
	m.BaseColor = c.BaseColor
	m.BaseMap = c.BaseMap
	m.MetalFactor = c.MetalFactor
	m.MetalMap = c.MetalMap

	m.RoughFactor = c.RoughFactor
	m.RoughMap = c.RoughMap
	m.NormalMap = c.NormalMap
	m.Name = c.Name
	if len(c.Type) > 0 {
		m.Type = c.Type
	}

	m.OpacFactor = c.OpacFactor
	m.OpacMap = c.OpacMap
	m.Uvtransform = c.Uvtransform

	m.CusNum = c.CusNum
	m.DiffuseColor = c.DiffuseColor
	m.DiffuseMap = c.DiffuseMap
	m.DisplaceFactor = c.DisplaceFactor
	m.DisplaceMap = c.DisplaceMap
	m.GlossFactor = c.GlossFactor
	m.GlossMap = c.GlossMap
	m.SpecColor = c.SpecColor
	m.SpecMap = c.SpecMap
}

type Queen3dPackageSource struct {
	Version string `bson:"version,omitempty" json:"version"`

	ViewMode string `bson:"viewMode,omitempty" json:"viewMode"` //prod or scene //单品或场景

	//材质球
	Mats []*MatConfigSource `bson:"mats,omitempty" json:"mats"`

	//几何体
	Geoms []*PackageGeom `bson:"geoms,omitempty" json:"geoms"`

	//环境
	Env3ds []*PackageEnv3d `bson:"env3ds,omitempty" json:"env3ds"`

	//使用的单品
	Products []*PackageProduct `bson:"products,omitempty" json:"products"`

	//场景
	Scenes []*PackageScene `bson:"scenes,omitempty" json:"scenes"`

	UserData interface{} `bson:"userData,omitempty" json:"userData"` //指定要数据放置的字段
}
