package bizhi

import (
	models2 "duoduo/apis/bizhi/models"
	orm "duoduo/database"
	"duoduo/tools"
	"fmt"
	"github.com/jinzhu/gorm"
	"strconv"
)

type User struct {
	ID         int64  `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` // 主键
	Phone      string `gorm:"column:phone;type:varchar(24)" json:"phone"`                     // 手机号
	OpenID1    string `gorm:"column:open_id_1;type:varchar(255)" json:"openId1"`              // 上级open_id
	NickName   string `gorm:"column:nick_name;type:varchar(255)" json:"nickName"`             // 微信用户名
	AvatarUrl  string `gorm:"column:avatar_url;type:varchar(255)" json:"avatarUrl"`           // 头像url
	Admin      int    `gorm:"column:admin;type:int(11)" json:"admin"`                         // 1-管理员
	OpenID     string `gorm:"column:open_id;type:varchar(255)" json:"openId"`                 // open_id
	CreateTime string `gorm:"column:create_time;type:datetime" json:"createTime"`             // 创建时间
	UpdateTime string `gorm:"column:update_time;type:datetime" json:"updateTime"`             // 更新时间
	Score      int    `gorm:"column:score;type:int(11)" json:"score"`                         // 积分
}

func (m *User) TableName() string {
	return "user"
}

func (u *User) GetNum() int {
	var count int
	tableCount := orm.BzMysql.Table(u.TableName()).Where("open_id = ? ", u.OpenID)
	tableCount.Count(&count)
	return count

}
func (u *User) Create() (User, error) {
	var doc User
	var err error

	tx := orm.BzMysql.Begin()
	defer func() {
		if err != nil {
			tx.Rollback()
		} else {
			tx.Commit()
		}
	}()
	if u.OpenID1 != "" { //有上级
		var score ScoreLogs
		err := tx.Table(u.TableName()).Create(&u).Error
		if err != nil {
			fmt.Println(err)
			return doc, err
		}
		score.Des = "新用户赠送积分"
		score.OpenID = u.OpenID
		score.Score = 3
		score.Type = 1
		score.CreateTime = tools.GetCurrntTimeStr()
		err = tx.Table("score_log").Create(&score).Error
		if err != nil {
			fmt.Println(err)
			return doc, err
		}
		score.Des = "邀请好友赠送积分"
		score.OpenID = u.OpenID1
		score.Score = 2
		score.Type = 4
		score.CreateTime = tools.GetCurrntTimeStr()

		err = tx.Table("score_log").Create(&score).Error
		if err != nil {
			fmt.Println(err)
			return doc, err
		}
		//更新用户积分
		scoreStr := strconv.Itoa(2)
		if err := tx.Table(u.TableName()).Where("open_id = ? ", u.OpenID1).Updates(
			map[string]interface{}{
				"score":       gorm.Expr("score + ?", scoreStr),
				"update_time": tools.GetCurrntTimeStr()}).Error; err != nil {
			return doc, err
		}

	} else {
		var score ScoreLog
		err := tx.Table(u.TableName()).Create(&u).Error
		if err != nil {
			fmt.Println(err)
			return doc, err
		}
		score.Des = "新用户赠送积分"
		score.OpenID = u.OpenID
		score.Score = 3
		score.Type = 1
		score.CreateTime = tools.GetCurrntTimeStr()

		err = tx.Table("score_log").Create(&score).Error
		if err != nil {
			fmt.Println(err)
			return doc, err
		}
	}

	doc = *u
	return doc, nil
}

func (u *User) GetScore() (User, error) {
	var doc User
	if err := orm.BzMysql.Table(u.TableName()).Where("open_id = ?", u.OpenID).Select("*").First(&doc).Error; err != nil {
		return doc, err
	}
	return doc, nil
}

func (u *User) SubScore(req models2.SubUserScoreRequest) error {
	var score ScoreLog
	var err error
	tx := orm.BzMysql.Begin()
	defer func() {
		if err != nil {
			tx.Rollback()
		} else {
			tx.Commit()
		}
	}()
	score.Score = req.Score
	score.OpenID = req.OpenId
	score.Des = req.Des
	score.CreateTime = tools.GetCurrntTimeStr()
	score.Type = req.Type
	//scoreStr := strconv.Itoa(req.Score)
	//scoreStr := tools.IntToString(req.Score)
	if err := tx.Table(u.TableName()).Model(&u).Where("open_id = ? ", u.OpenID).Updates(
		map[string]interface{}{
			"score":       gorm.Expr("score + ?", req.Score),
			"update_time": tools.GetCurrntTimeStr()}).Error; err != nil {
		return err
	}

	if err := tx.Table(score.TableName()).Create(&score).Error; err != nil {
		return err
	}

	return nil
}

//list 接口使用
func (u *User) GetOpenIdList(pageSize int, pageIndex int) ([]User, int, error) {
	var doc []User

	table := orm.BzMysql.Table(u.TableName())

	table = table.Where("open_id_1 = ?  ", u.OpenID)

	var count int
	if err := table.Select("id,nick_name,avatar_url,DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') as create_time").Order("id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
		return nil, 0, err
	}
	table.Count(&count)
	return doc, count, nil
}

func (u *User) UpdateUserName() error {

	if err := orm.BzMysql.Table(u.TableName()).Model(&u).Where("open_id = ? ", u.OpenID).Updates(
		map[string]interface{}{
			"nick_name":   u.NickName,
			"avatar_url":  u.AvatarUrl,
			"update_time": tools.GetCurrntTimeStr()}).Error; err != nil {
		return err
	}
	return nil
}