package models

import (
	"github.com/beego/beego/v2/client/orm"
	"time"
)

type UserRecord struct {
	UserRecordId   int       `orm:"column(user_record_id);pk"`
	OpenId         string    `description:"用户openid，最大长度：32"`
	UnionId        string    `description:"用户unionid，最大长度：64"`
	Subscribe      int       `description:"是否关注"`
	NickName       string    `descritpion:"用户昵称，最大长度：32"`
	RealName       string    `descritpion:"用户实际名称，最大长度：32"`
	BindAccount    string    `descritpion:"绑定时的账号，最大长度：128"`
	Sex            int       `descritpion:"普通用户性别，1为男性，2为女性"`
	Province       string    `description:"普通用户个人资料填写的省份,最大长度：30"`
	City           string    `description:"普通用户个人资料填写的城市,最大长度：30"`
	Country        string    `description:"国家，如中国为CN,最大长度：30"`
	Headimgurl     string    `description:"用户第三方（微信）头像,最大长度：512"`
	CreateTime     time.Time `description:"创建时间，关系添加时间、用户授权时间"`
	CreatePlatform int       `description:"注册平台,1:日度点评公众号,2:管理后台，3：pc端网站,4:查研观向小程序；默认：1"`
	SessionKey     string    `description:"微信小程序会话密钥，最大长度：255"`
	UserId         int       `description:"用户id"`
}

// 根据openid获取用户关系
func GetUserRecordByOpenId(openId string) (item *UserRecord, err error) {
	sql := `SELECT * FROM user_record WHERE open_id=? `
	err = orm.NewOrm().Raw(sql, openId).QueryRow(&item)
	return
}

// 根据用户id和平台id获取用户关系
func GetUserRecordByUserId(userId, platform int) (item *UserRecord, err error) {
	sql := `SELECT * FROM user_record WHERE user_id=? AND create_platform = ?`
	err = orm.NewOrm().Raw(sql, userId, platform).QueryRow(&item)
	return
}

// 添加用户关系
func AddUserRecord(record *UserRecord) (recordId int64, err error) {
	o := orm.NewOrm()
	recordId, err = o.Insert(record)
	return
}

// 根据openid绑定用户关系
func BindUserRecordByOpenid(userId int, openId, bindAccount string) (err error) {
	o := orm.NewOrm()
	msql := " UPDATE user_record SET user_id = ?,bind_account=? WHERE open_id = ? "
	_, err = o.Raw(msql, userId, bindAccount, openId).Exec()
	return
}

// 修改用户微信信息
func ModifyUserRecordInfo(openId, nickName, headimgUrl, city, province, country string, sex, userId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE user_record SET nick_name=?,headimgurl=?,sex=?,city=?,province=?,country=? WHERE user_id=? and openid=? `
	_, err = o.Raw(sql, nickName, headimgUrl, sex, city, province, country, userId, openId).Exec()
	return
}

// 根据用户id删除该用户的所有关联关系
func DelUserRecordByUserId(userId int) (err error) {
	o := orm.NewOrm()
	sql := ` DELETE FROM user_record WHERE user_id=? `
	_, err = o.Raw(sql, userId).Exec()
	return
}

// GetUserRecordListByUserIds 根据用户id字符串批量获取该用户的所有关联关系
func GetUserRecordListByUserIds(userIds string) (items []*UserRecord, err error) {
	o := orm.NewOrm()
	sql := ` select *  FROM user_record WHERE user_id in (` + userIds + `) `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 根据用户id字符串批量删除该用户的所有关联关系
func DelUserRecordByUserIds(userIds string) (err error) {
	o := orm.NewOrm()
	sql := ` DELETE FROM user_record WHERE user_id in (` + userIds + `) `
	_, err = o.Raw(sql).Exec()
	return
}

// 根据用户id字符串获取用户绑定时间结构体
type UserRecordRegisterSlice struct {
	UserId     int       `description:"用户id"`
	CreateTime time.Time `description:"用户第三方信息绑定注册时间"`
}

// 根据用户id字符串获取用户绑定时间
func GetUserRecordRegisterByUserIds(userIds string) (items []*UserRecordRegisterSlice, err error) {
	o := orm.NewOrm()
	sql := `SELECT user_id,min(create_time) as create_time FROM user_record WHERE user_id in (` + userIds + `) group by user_id`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 根据用户id字符串获取用户绑定时间 (查研观向与买方研选小程序)
func GetUserRecordRegisterByUserIdsMyfx(userIds string) (items []*UserRecordRegisterSlice, err error) {
	o := orm.NewOrm()
	sql := `SELECT user_id,min(create_time) as create_time FROM user_record WHERE user_id in (` + userIds + `) AND  create_platform IN  (4,10)  group by user_id`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 根据手机号获取用户的openid
func GeCygxtUserRecordListByMobile(bindAccount string) (items []*OpenIdList, err error) {
	var sql string
	o := orm.NewOrmUsingDB("hz_cygx")
	sql = `SELECT
			cr.open_id,
			cr.cygx_user_id as  user_id 
		FROM
		  cygx_user_record  as cr 
		WHERE 1= 1	AND cygx_bind_account IN (` + bindAccount + `)`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func GetWxOpenIdByMobileList(mobile string) (items []*OpenIdList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := ` SELECT
				union_id,open_id,
				cygx_user_id AS user_id
				FROM cygx_user_record	WHERE	1 = 1	AND cygx_bind_account IN (` + mobile + `)`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}