package db

import (
	"applet/app/db/model"
	"applet/app/md"
	"applet/app/utils"
	"applet/app/utils/cache"
	"applet/app/utils/logx"
	"fmt"
	"reflect"
	"xorm.io/xorm"
)

func GetVirtualCoinList(eg *xorm.Engine) ([]*model.VirtualCoin, error) {
	var m []*model.VirtualCoin
	err := eg.Find(&m)
	if err != nil {
		return nil, err
	}

	return m, nil
}
func GetVirtualCoinIsUseList(eg *xorm.Engine) ([]*model.VirtualCoin, error) {
	var m []*model.VirtualCoin
	err := eg.Where("is_use = ?", 1).Find(&m)
	if err != nil {
		return nil, err
	}

	return m, nil
}

// VirtualCoinListInUse 查询正在使用中的虚拟币
func VirtualCoinListInUse(Db *xorm.Engine, masterId string) ([]*model.VirtualCoin, error) {
	var m []*model.VirtualCoin
	cacheKey := fmt.Sprintf(md.VirtualCoinCfgCacheKey, masterId)

	err := cache.GetJson(cacheKey, &m)
	if err != nil || len(m) == 0 {
		err := Db.Where("is_use=1").Find(&m)
		if err != nil {
			return nil, err
		}
		cache.SetJson(cacheKey, m, md.CfgCacheTime)
	}

	return m, nil
}

// VirtualCoinGetOneByParams 通过参数查询数据（单条）
func VirtualCoinGetOneByParams(Db *xorm.Engine, params map[string]interface{}) (*model.VirtualCoin, error) {
	var m model.VirtualCoin
	var query = fmt.Sprintf("%s =?", params["key"])
	if has, err := Db.Where(query, params["value"]).Get(&m); err != nil || has == false {
		return nil, logx.Error(err)
	}
	return &m, nil
}

// VirtualCoinFindByParams 通过传入的参数查询数据(多条)
func VirtualCoinFindByParams(Db *xorm.Engine, params map[string]interface{}) (*[]model.VirtualCoin, error) {
	var m []model.VirtualCoin
	if params["key"] == nil {
		//查询全部数据
		err := Db.Find(&m)
		if err != nil {
			return nil, logx.Error(err)
		}
		return &m, nil
	} else {
		if reflect.TypeOf(params["value"]).Kind() == reflect.Slice {
			//指定In查询
			if err := Db.In(utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil {
				return nil, logx.Warn(err)
			}
			return &m, nil
		} else {
			var query = fmt.Sprintf("%s =?", params["key"])
			err := Db.Where(query, params["value"]).Find(&m)
			if err != nil {
				return nil, logx.Error(err)
			}
			return &m, nil
		}

	}
}
func VirtualCoinGetOneById(Db *xorm.Engine, coinId string) (*model.VirtualCoin, error) {
	var m model.VirtualCoin
	if has, err := Db.ID(coinId).Get(&m); err != nil || has == false {
		return nil, logx.Error(err)
	}
	return &m, nil
}

func VirtualCoinOrderRelateDeleteByOid(Db *xorm.Engine, oid int64, pvd string) (int64, error) {
	_, err := Db.Where("oid=? and pvd=?", oid, pvd).Delete(model.VirtualCoinRelate{})
	if err != nil {
		return 0, err
	}
	return 1, nil
}

func VirtualCoinMapInUse(Db *xorm.Engine, masterId string) (map[string]model.VirtualCoin, error) {
	virtualCoinMap := make(map[string]model.VirtualCoin)
	listInUse, err := VirtualCoinListInUse(Db, masterId)
	if err != nil {
		return nil, err
	}
	for _, coin := range listInUse {
		virtualCoinMap[utils.AnyToString(coin.Id)] = *coin
	}
	return virtualCoinMap, nil
}
