package gmodel

import "context"

type RelaFsProduct struct {
	FsProduct
	CoverResource *FsResource `json:"cover_resource" gorm:"foreignkey:cover;references:resource_url"`
}

func (m *FsProductModel) TableName() string {
	return m.name
}

func (p *FsProductModel) FindOne(ctx context.Context, id int64, fields ...string) (resp *FsProduct, err error) {
	db := p.db.WithContext(ctx).Model(&FsProduct{}).Where("`id` = ? ", id)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Take(&resp).Error
	return resp, err
}
func (p *FsProductModel) FindOneBySn(ctx context.Context, sn string, fields ...string) (resp *FsProduct, err error) {
	db := p.db.WithContext(ctx).Model(&FsProduct{}).Where("`sn` = ? ", sn)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Take(&resp).Error
	return resp, err
}
func (p *FsProductModel) GetProductListByIds(ctx context.Context, productIds []int64, sort string, fields ...string) (resp []FsProduct, err error) {
	if len(productIds) == 0 {
		return
	}
	db := p.db.Model(&FsProduct{}).WithContext(ctx).
		Where("`id` in (?) and `is_del` =? and `is_shelf` = ? and `status` =?", productIds, 0, 1, 1)
	if len(fields) > 0 {
		db = db.Select(fields[0])
	}
	switch sort {
	case "sort-asc":
		db = db.Order("`sort` ASC")
	case "sort-desc":
		db = db.Order("`sort` DESC")
	}
	if err = db.Find(&resp).Error; err != nil {
		return nil, err
	}
	return
}
func (p *FsProductModel) GetProductListByIdsWithoutStatus(ctx context.Context, productIds []int64, sort string) (resp []FsProduct, err error) {
	if len(productIds) == 0 {
		return
	}
	db := p.db.Model(&FsProduct{}).WithContext(ctx).
		Where("`id` in (?)  ", productIds)
	switch sort {
	case "sort-asc":
		db = db.Order("`sort` ASC")
	case "sort-desc":
		db = db.Order("`sort` DESC")
	}
	if err = db.Find(&resp).Error; err != nil {
		return nil, err
	}
	return
}
func (p *FsProductModel) GetProductListByTypeIds(ctx context.Context, productTypes []int64, page int, limit int, sort string) (resp []FsProduct, total int64, err error) {
	if len(productTypes) == 0 {
		return
	}
	db := p.db.WithContext(ctx).Model(&FsProduct{}).Where("`type` in (?) and `is_del` =? and `is_shelf` = ? and `status` =?", productTypes, 0, 1, 1)
	switch sort {
	case "sort-asc":
		db = db.Order("`sort` ASC")
	case "sort-desc":
		db = db.Order("`sort` DESC")
	}
	err = db.Count(&total).Error
	if err != nil {
		return nil, 0, err
	}
	offset := (page - 1) * limit
	err = db.Offset(offset).Limit(limit).Find(&resp).Error
	return resp, total, err
}
func (p *FsProductModel) GetRandomProductList(ctx context.Context, limit int) (resp []FsProduct, err error) {
	err = p.db.WithContext(ctx).Model(&FsProduct{}).
		Where("`is_del` =? and `is_shelf` = ?", 0, 1).Order("RAND()").Limit(limit).Find(&resp).Error
	return resp, err
}
func (p *FsProductModel) GetIgnoreRandomProductList(ctx context.Context, notEqType int64, limit int, notInProductIds []int64) (resp []FsProduct, err error) {
	db := p.db.WithContext(ctx).Model(&FsProduct{}).
		//过滤报价单产品
		Where("`is_del` =? and `is_shelf` = ? and `type` != ?", 0, 1, notEqType)
	if len(notInProductIds) > 0 {
		db = db.Where("`id` not in(?)", notInProductIds)
	}
	err = db.Order("RAND()").Limit(limit).Find(&resp).Error
	return resp, err
}
func (p *FsProductModel) FindAllOnlyByIds(ctx context.Context, ids []int64) (resp []FsProduct, err error) {
	err = p.db.WithContext(ctx).Model(&FsProduct{}).Where("`id` IN (?)", ids).Find(&resp).Error
	return resp, err
}
func (p *FsProductModel) GetRandomProductListInIds(ctx context.Context, ids []int64, limit int, fields ...string) (resp []FsProduct, err error) {
	if len(ids) == 0 {
		return
	}
	db := p.db.WithContext(ctx).Model(&FsProduct{}).
		Where("`id` in (?) and `is_del` =? and `is_shelf` = ?", ids, 0, 1).Order("RAND()").Limit(limit)
	if len(fields) != 0 {
		db = db.Select(fields[0])
	}
	err = db.Find(&resp).Error
	return resp, err
}

type GetProductListByParamsReq struct {
	Type    []int64
	IsDel   *int64
	IsShelf *int64
	Status  *int64
	OrderBy string
}

func (p *FsProductModel) GetProductListByParams(ctx context.Context, req GetProductListByParamsReq) (resp []FsProduct, err error) {
	db := p.db.WithContext(ctx).Model(&FsProduct{})
	if len(req.Type) > 0 {
		db = db.Where("`type` in (?)", req.Type)
	}
	if req.IsDel != nil {
		db = db.Where("`is_del` = ?", *req.IsDel)
	}
	if req.IsShelf != nil {
		db = db.Where("`is_shelf` = ?", *req.IsShelf)
	}
	if req.Status != nil {
		db = db.Where("`status` = ?", *req.Status)
	}
	switch req.OrderBy {
	case "":
		db = db.Order("`id` DESC")
	default:
		db = db.Order(req.OrderBy)
	}
	err = db.Find(&resp).Error
	return resp, err
}