package mysql

import (
	orm "duoduo/database"
	"duoduo/tools"
	"errors"
)

type User struct {
	CreateTime string `gorm:"column:create_time" json:"createTime"`
	OpenID     string `gorm:"column:open_id" json:"openId"`
	Phone      string `gorm:"column:phone" json:"phone"`
	Pid        string `gorm:"column:pid" json:"pid"`
	UpdateTime string `gorm:"column:update_time" json:"updateTime"`
	NickName   string `gorm:"column:nick_name" json:"nickName"`
	AvatarUrl  string `gorm:"column:avatar_url" json:"avatarUrl"`
	OpenIdOne  string `gorm:"column:open_id_1" json:"openIdOne"`
	OpenIdTwo  string `gorm:"column:open_id_2" json:"openIdTwo"`
	Admin      int    `gorm:"column:admin" json:"admin"`    //1-管理员
	AliPay     string `gorm:"column:ali_pay" json:"aliPay"` //
	WxPay      string `gorm:"column:wx_pay" json:"wxPay"`
}

type UserName struct {
	CreateTime string `gorm:"column:create_time" json:"createTime"`
	OpenID     string `gorm:"column:open_id" json:"openId"`
	Phone      string `gorm:"column:phone" json:"phone"`
	Pid        string `gorm:"column:pid" json:"pid"`
	UpdateTime string `gorm:"column:update_time" json:"updateTime"`
	NickName   string `gorm:"column:nick_name" json:"nickName"`
	AvatarUrl  string `gorm:"column:avatar_url" json:"avatarUrl"`
	OpenIdOne  string `gorm:"column:open_id_1" json:"openIdOne"`
	OpenIdTwo  string `gorm:"column:open_id_2" json:"openIdTwo"`
	Id         int    `gorm:"column:id" json:"id"`
	Admin      int    `gorm:"column:admin" json:"admin"`    //1-管理员 2-超级管理员
	AliPay     string `gorm:"column:ali_pay" json:"aliPay"` //
	WxPay      string `gorm:"column:wx_pay" json:"wxPay"`
}

// TableName sets the insert table name for this struct type
func (u *User) TableName() string {
	return "user"
}

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

}

func (u *User) Get() (UserName, error) {
	var doc UserName
	err := orm.Eloquent.Select("id,pid,nick_name,avatar_url,open_id_1,open_id_2,admin,wx_pay,ali_pay").Where("open_id = ? ", u.OpenID).Table(u.TableName()).First(&doc).Error
	if err != nil {
		return doc, err
	}
	return doc, nil

}

func (u *User) Create() (User, error) {
	var doc User
	result := orm.Eloquent.Table(u.TableName()).Create(&u)
	if result.Error != nil {
		err := result.Error
		return doc, err
	}
	doc = *u
	return doc, nil
}

func (u *User) Update() (update User, err error) {

	if err := orm.Eloquent.Table(u.TableName()).Model(&update).Where("open_id = ? ", u.OpenID).Updates(
		map[string]interface{}{
			"pid":         u.Pid,
			"update_time": tools.GetCurrntTimeStr()}).Error; err != nil {
		return update, err
	}

	return update, nil
}

func (u *User) UpdateName() (update User, err error) {

	if err := orm.Eloquent.Table(u.TableName()).Model(&update).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 update, err
	}

	return update, nil
}

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

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

	if status == 1 {
		table = table.Where("open_id_1 = ?  ", u.OpenID)
	} else if status == 2 {
		table = table.Where("open_id_2 = ?  ", u.OpenID)
	} else {
		return nil, 0, errors.New("status err")
	}

	//table = table.Where("open_id = ?  ", o.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
}