package model

import (
	"active/constant"
	"database/sql"
	"encoding/json"
	"fmt"
	"time"

	"git.jiaxianghudong.com/go/logs"
	"git.jiaxianghudong.com/webs/pkg/dbx"
)

//Precious 神秘宝藏
type Precious struct {
	ID           int            `json:"id" sql:"id"`                       //
	UserID       int            `json:"userid" sql:"userid"`               //用户ID
	Goodstag     string         `json:"goodstag" sql:"goodstag"`           //商品标识符 计费点
	Multiple     int            `json:"multiple" sql:"multiple"`           //倍数 10:1（20 则为2倍）
	Count        int            `json:"count" sql:"count"`                 //每日抽奖次数
	Date         sql.NullString `json:"date" sql:"date"`                   //抽奖时间
	Locked       int            `json:"locked" sql:"locked"`               //锁定 1 锁定计费点  2 锁定倍数
	Lockeddate   sql.NullString `json:"locked_date" sql:"locked_date"`     //锁定时间
	Usesurprised int            `json:"use_surprised" sql:"use_surprised"` //1 抽中过 是抽中过必现奖励6,12 的10倍奖励
	Updatetime   string         `json:"update_time" sql:"update_time"`     //更新时间
}

//PreciousData 神秘宝藏礼包存储数据
type PreciousData struct {
	PayTime string `yaml:"pay_time" json:"pay_time"`
	Count   int    `yaml:"count" json:"count"`
}

// GetPrecious 获取全部活动数据
func (m *Precious) GetPrecious() error {
	err := dbx.MySQLExt.QueryRow("SELECT goodstag,multiple,count,date,locked,locked_date,use_surprised from `log`.`pay_precious_log` where userid = ? ",
		m.UserID).Scan(&m.Goodstag, &m.Multiple, &m.Count, &m.Date, &m.Locked, &m.Lockeddate, &m.Usesurprised)
	if nil != err {
		if err == sql.ErrNoRows {
			return InitPreciousLog(m.UserID)
		}

		logs.Errorf("GetPrecious err:%v", err)
		return err
	}

	return nil
}

//UpdatePreciousCounts 更新抽奖使用数据
func (m *Precious) UpdatePreciousCounts() (int64, error) {
	m.Updatetime = time.Now().Format("2006-01-02 15:04:05")
	querySQL := `UPDATE log.pay_precious_log SET goodstag = ?, multiple = ?, count= ?, date=?, use_surprised=?, update_time=?, locked=? where userid = ? `
	count, err := dbx.MySQLExt.Update(querySQL,
		m.Goodstag,
		m.Multiple,
		m.Count,
		time.Now().Format("2006-01-02"),
		m.Usesurprised,
		m.Updatetime,
		m.Locked,
		m.UserID)
	if nil != err && err != sql.ErrNoRows {
		logs.Errorf("UpdatePreciousCounts err:%v", err)
		return 0, err
	}
	return count, nil
}

//InitPreciousLog 初始化表记录
func InitPreciousLog(userID int) error {
	querySQL := "INSERT INTO log.pay_precious_log set userid = ?"
	_, err := dbx.MySQLExt.Insert(querySQL, userID)
	if err != nil {
		logs.Error(fmt.Sprintf("InitPreciousLog sqlStr: %s err: %v", querySQL, err))
		return err
	}
	return nil
}

//UpdatePreciousLocked 更新锁定
func (m *Precious) UpdatePreciousLocked() (int64, error) {
	m.Updatetime = time.Now().Format("2006-01-02 15:04:05")
	querySQL := `UPDATE log.pay_precious_log SET goodstag = ?, multiple = ?, locked_date =?, update_time=?, locked=? where userid = ? `
	count, err := dbx.MySQLExt.Update(querySQL,
		m.Goodstag,
		m.Multiple,
		time.Now().Format("2006-01-02"),
		m.Updatetime,
		m.Locked,
		m.UserID)
	if nil != err && err != sql.ErrNoRows {
		logs.Errorf("UpdatePreciousCounts err:%v", err)
		return 0, err
	}
	return count, nil
}

//GetPreciousPayCount 更新神秘活动
func GetPreciousPayCount(data string, ver int) int {
	count := constant.MaxPayPrecious
	if ver >= 1 {
		count = constant.MaxPayShakeBean
	}
	pd := PreciousData{}
	if len(data) > 0 {
		err := json.Unmarshal([]byte(data), &pd)
		if err != nil {
			logs.Errorf("GetPreciousPayCount: json data:%s err:%v", data, err)
		}
	}
	//购买每日重制
	if time.Now().Format("2006-01-02") != pd.PayTime {
		return count
	}

	if pd.Count >= count {
		return 0
	}

	return count - pd.Count
}

//GetRegressPayCount 获取付费老用户回归
func GetRegressPayCount(data string) int {

	pd := PreciousData{}
	if len(data) > 0 {
		err := json.Unmarshal([]byte(data), &pd)
		if err != nil {
			logs.Errorf("GetPreciousPayCount: json data:%s err:%v", data, err)
		}
	}

	//购买每日重制
	if time.Now().Format("2006-01-02") != pd.PayTime {
		return constant.MaxPayRegress
	}

	if pd.Count >= constant.MaxPayRegress {
		return 0
	}

	return constant.MaxPayRegress - pd.Count
}

//ChangeGoodsTag 更新最高计费点
func ChangeGoodsTag(goodstag string, userid int) (int64, error) {
	querySQL := `UPDATE log.pay_precious_log SET goodstag = ? where userid = ? `
	count, err := dbx.MySQLExt.Update(querySQL,
		goodstag,
		userid)
	if nil != err && err != sql.ErrNoRows {
		logs.Errorf("ChangeGoodsTag err:%v", err)
		return 0, err
	}
	return count, nil
}
