package model

import (
	"fmt"
	"github.com/jmoiron/sqlx"
	"strconv"
	"trading-go/common"
	"trading-go/response"
	"trading-go/util"
)

type User struct {
	Uid    uint   `db:"uid" json:"uid,string"`
	Vid    string `db:"vid" json:"vid"`
	Name   string `db:"name" json:"name"`
	Avatar string `db:"avatar" json:"avatar"`
	Phone  string `db:"phone" json:"phone"`
	Sign   string `db:"sign" json:"sign"`
}

type UserJson struct {
	Uid    string `json:"uid,string"`
	Vid    string `json:"vid"`
	Name   string `json:"name"`
	Avatar string `json:"avatar"`
	Phone  string `json:"phone"`
	Sign   string `json:"sign"`
}

func (u UserJson) Change() User {
	uid, _ := strconv.Atoi(u.Uid)
	return User{
		Uid:    uint(uid),
		Vid:    u.Vid,
		Name:   u.Name,
		Avatar: u.Avatar,
		Phone:  u.Phone,
		Sign:   u.Sign,
	}
}

func (u User) Register() error {
	db := common.DB
	sqlStr := "INSERT INTO users(uid, vid,name, avatar, phone, sign) values (:uid, :vid, :name, :avatar, :phone, :sign)"
	exec, err := db.NamedExec(sqlStr, u)
	if err != nil {
		return err
	}
	affected, err := exec.RowsAffected()
	if err != nil {
		return err
	}
	if affected != 1 {
		return util.InsertFailError
	}
	return nil
}

func (u User) Login() (err error, nu User) {
	db := common.DB
	sqlStr := "SELECT * FROM users WHERE vid = ?"
	err = db.Get(&nu, sqlStr, u.Vid)
	return
}

// SPhone 查找电话号码
func (u User) SPhone() error {
	var nu User
	db := common.DB
	fmt.Println(u.Phone)
	sqlStr := "SELECT * FROM users WHERE phone = ?"
	err := db.Get(&nu, sqlStr, u.Phone)
	if err != nil && err.Error() == "sql: no rows in result set" {
		return nil
	} else if err != nil {
		return err
	}
	return util.PhoneBeUsed
}

// Modify 修改信息
func (u User) Modify(old *User) (User, error) {
	var user User
	db := common.DB

	if u.Name == "" {
		u.Name = old.Name
	}

	if u.Avatar == "" {
		u.Avatar = old.Avatar
	}

	if u.Phone == "" {
		u.Phone = old.Phone
	}

	if u.Sign == "" {
		u.Sign = old.Sign
	}

	sqlStr := "UPDATE users set name = ?,avatar = ?, phone = ?, sign = ? WHERE uid = ?"
	exec, err := db.Exec(sqlStr, u.Name, u.Avatar, u.Phone, u.Sign, u.Uid)
	if err != nil {
		return User{}, err
	}
	affected, err := exec.RowsAffected()
	if err != nil {
		return User{}, err
	}
	if affected != 1 {
		return User{}, util.UpdateFailError
	}
	sqlStr = "SELECT * FROM users WHERE uid = ?"
	err = db.Get(&user, sqlStr, u.Uid)
	if err != nil {
		return User{}, err
	}
	return user, nil
}

func (u User) FindByIds(ids []uint) (users []User, err error) {
	db := common.DB
	sqlStr := "SELECT * FROM users WHERE uid = ?"
	for i := 0; i < len(ids); i++ {
		err := db.Get(&users[i], sqlStr, ids[i])
		if err != nil {
			return nil, err
		}
	}
	return
}

// Info 获取用户信息
func (u User) Info() (nu User, err error) {
	db := common.DB
	sqlStr := "SELECT * FROM users WHERE uid = ?"
	err = db.Get(&nu, sqlStr, u.Uid)
	return
}

func (u User) GetPaged(page, pageSize int) (rsp response.PageResponse, err error) {
	var users []User
	db := common.DB
	sqlStr := "SELECT * FROM users LIMIT ?,?"
	rsp.Page = page
	rsp.PageSize = pageSize
	err = db.Select(&users, sqlStr, (page-1)*pageSize, pageSize)
	rsp.Data = users
	return
}

func (u User) GetCnt() (cnt int, err error) {
	db := common.DB
	sqlStr := "SELECT COUNT(1) FROM users"
	err = db.Get(&cnt, sqlStr)
	return
}

func (u User) CheckVid() bool {
	db := common.DB
	sqlStr := "SELECT COUNT(1) FROM users WHERE vid = ?"
	cnt := 0
	_ = db.Get(&cnt, sqlStr, u.Vid)
	return cnt == 0
}

func (u User) GetUser() (user User) {
	db := common.DB
	sqlStr := "SELECT * FROM users WHERE uid = ?"
	_ = db.Get(&user, sqlStr, u.Uid)
	return
}

func (u User) GetUserList(uid []string) (users []User, err error) {
	db := common.DB
	sqlStr := "SELECT * FROM users WHERE uid IN (?)"
	query, args, err := sqlx.In(sqlStr, uid)
	if err != nil {
		return nil, err
	}
	err = db.Select(&users, query, args...)
	return
}