package gmodel

import (
	"context"
)

func (t *FsProductTemplateV2Model) FindAllByProductIds(ctx context.Context, productIds []int64, sort string, fields ...string) (resp []FsProductTemplateV2, err error) {
	if len(productIds) == 0 {
		return
	}
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`product_id` in (?) and `is_del` = ? and `status` = ?", productIds, 0, 1)
	if sort != "" {
		db = db.Order(sort)
	}
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Find(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindAllByIds(ctx context.Context, ids []int64, fields ...string) (resp []FsProductTemplateV2, err error) {
	if len(ids) == 0 {
		return
	}
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`id` in (?) and `is_del` = ? and `status` = ?", ids, 0, 1)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Find(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindAllByIdsWithoutStatus(ctx context.Context, ids []int64, fields ...string) (resp []FsProductTemplateV2, err error) {
	if len(ids) == 0 {
		return
	}
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`id` in (?) ", ids)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Find(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindOne(ctx context.Context, id int64) (resp *FsProductTemplateV2, err error) {

	err = t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`id` = ? ", id).Take(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindByParam(ctx context.Context, id int64, modelId int64, fields ...string) (resp *FsProductTemplateV2, err error) {
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`id` = ? and `model_id` = ?", id, modelId)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Take(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) Update(ctx context.Context, id int64, data *FsProductTemplateV2) error {
	return t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`id` = ? ", id).Updates(&data).Error
}
func (t *FsProductTemplateV2Model) FindAllByModelIds(ctx context.Context, modelIds []int64, orderBy string, fields ...string) (resp []FsProductTemplateV2, err error) {
	if len(modelIds) == 0 {
		return
	}
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`model_id` in (?) and `is_del` = ? and `status` = ?", modelIds, 0, 1)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	switch orderBy {
	case "":
		db = db.Order("id DESC")
	default:
		db = db.Order(orderBy)
	}
	err = db.Find(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindAllByProductIdModelIds(ctx context.Context, modelIds []int64, productId int64) (resp []FsProductTemplateV2, err error) {
	if len(modelIds) == 0 {
		return
	}
	err = t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`model_id` in (?) and `product_id` = ? ", modelIds, productId).Find(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindOneByModelId(ctx context.Context, modelId int64) (resp *FsProductTemplateV2, err error) {
	err = t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`model_id` = ? ", modelId).Take(&resp).Error
	return resp, err
}

type GetProductTemplateListByParamsReq struct {
	ProductIds []int64 //必传哦
	GroupBy    string
	OrderBy    string
	Fields     string
	Status     *int64
}

func (t *FsProductTemplateV2Model) GetProductTemplateListByParams(ctx context.Context, req GetProductTemplateListByParamsReq) (resp []FsProductTemplateV2, err error) {
	if len(req.ProductIds) == 0 {
		return
	}
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`product_id` in (?)", req.ProductIds)
	if req.GroupBy != "" {
		db = db.Group(req.GroupBy)
	}
	if req.OrderBy != "" {
		db = db.Order(req.OrderBy)
	}
	if req.Fields != "" {
		db = db.Select(req.Fields)
	}
	if req.Status != nil {
		db = db.Where("`status` = ?", req.Status)
	}
	err = db.Find(&resp).Error
	return resp, err
}

// 获取开启云渲染模板
func (t *FsProductTemplateV2Model) FindOneCloudRenderByProductIdModelIdTemplateTag(ctx context.Context, productId, modelId int64, templateTag string) (resp *FsProductTemplateV2, err error) {
	err = t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).
		Where("product_id = ? and model_id = ? and template_tag = ?  ", productId, modelId, templateTag).
		Where("status = ? and is_del = ?", 1, 0).
		Order("sort ASC").
		Take(&resp).Error
	return resp, err
}

// 获取开启云渲染模板2
func (t *FsProductTemplateV2Model) FindOneCloudRenderByProductIdTemplateTag(ctx context.Context, productId int64, templateTag string, sort string, fields ...string) (resp *FsProductTemplateV2, err error) {
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).
		Where("product_id = ? and template_tag = ?  and element_model_id > ? ", productId, templateTag, 0).
		Where("status = ? and is_del = ?", 1, 0)
	if sort != "" {
		db = db.Order(sort)
	}
	if len(fields) > 0 {
		db = db.Select(fields[0])
	}
	err = db.Take(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindAllByModelIdsTemplateTag(ctx context.Context, modelIds []int64, templateTag string, orderBy string, fields ...string) (resp []FsProductTemplateV2, err error) {
	if len(modelIds) == 0 {
		return
	}
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`model_id` in (?) and `template_tag` = ? and `is_del` = ? and `status` = ?", modelIds, templateTag, 0, 1)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	switch orderBy {
	case "":
		db = db.Order("id DESC")
	default:
		db = db.Order(orderBy)
	}
	err = db.Find(&resp).Error
	return resp, err
}

// 获取产品在指定模板标签下的所有模板
func (t *FsProductTemplateV2Model) GetListByProductAndTemplateTag(ctx context.Context, templateTagId string, productId int64, fields ...string) (resp []FsProductTemplateV2, err error) {
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).
		Where("template_tag = ? and product_id = ? and status = ? and is_del = ?", templateTagId, productId, 1, 0)
	if len(fields) > 0 {
		db = db.Select(fields[0])
	}
	err = db.Find(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindAllByProductIdsTemplateTag(ctx context.Context, productIds []int64, templateTag string, sort string, fields ...string) (resp []FsProductTemplateV2, err error) {
	if len(productIds) == 0 {
		return
	}
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`product_id` in (?) and `template_tag` = ? and `is_del` = ? and `status` = ?", productIds, templateTag, 0, 1)
	if sort != "" {
		db = db.Order(sort)
	}
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Find(&resp).Error
	return resp, err
}
func (t *FsProductTemplateV2Model) FindAllByFittingIds(ctx context.Context, fittingIds []int64, fields ...string) (resp []FsProductTemplateV2, err error) {
	db := t.db.WithContext(ctx).Model(&FsProductTemplateV2{}).Where("`model_id` in(?) and `status` = ? and `is_del` = ?  ", fittingIds, 1, 0)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Find(&resp).Error
	return resp, err
}