package sysuser

import (
	"strconv"
	"time"
	"wechat-conf/models"
	"wechat-conf/models/model"
	"wechat-conf/utils"

	"github.com/go-xorm/xorm"
)

// SysuserDAO 当前数据库操作对象
type SysuserDAO struct {
	ctx *utils.Context
	db  *xorm.Session
}

// NewSysuserDAO New Inst
func NewSysuserDAO(ctx *utils.Context) *SysuserDAO {
	return &SysuserDAO{
		ctx: ctx,
		db:  ctx.DB,
	}
}

type User struct {
	model.SysUser `xorm:"extends"`
	OrgName       string
}

func (m *SysuserDAO) GetSysuserList(page, pageSize int) ([]User, error) {
	var user []User
	sql := `SELECT a.*,b.org_name from sys_user a left join sys_org b on a.org_id = b.org_id
	 WHERE a.status >` + strconv.Itoa(models.STATUS_DEL) + `
	order by create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
	err := m.db.Sql(sql).Find(&user)
	return user, err

}
func (m *SysuserDAO) GetSysuserListCount() (int, error) {
	var user []model.SysUser
	sql := `SELECT * from sys_user WHERE status >` + strconv.Itoa(models.STATUS_DEL)
	err := m.db.Sql(sql).Find(&user)
	return len(user), err

}
func (m *SysuserDAO) GetSysuserById(userId string) (*model.SysUser, error) {
	var user []model.SysUser
	sql := `SELECT * from sys_user WHERE status >` + strconv.Itoa(models.STATUS_DEL) + `
	 and user_id = '` + userId + `'`
	err := m.db.Sql(sql).Find(&user)
	if len(user) > 0 {
		return &user[0], err
	}
	return nil, err
}
func (m *SysuserDAO) GetSysuserByOrgId(orgId string) (*model.SysUser, error) {
	var user []model.SysUser
	sql := `SELECT * from sys_user where org_id = '` + orgId + `'`
	err := m.db.Sql(sql).Find(&user)
	if len(user) > 0 {
		return &user[0], err
	}
	return nil, err
}
func (m *SysuserDAO) AddUser(user model.SysUser) (*model.SysUser, error) {
	user.CreateDate = time.Now()
	user.Status = models.STATUS_NORMAL
	_, err := m.db.Insert(user)
	return &user, err
}
func (m *SysuserDAO) DeleteUser(userId string) error {
	var user = model.SysUser{
		UserId: userId,
		Status: models.STATUS_DEL,
	}
	var cols = []string{
		"status",
	}
	_, err := m.db.Cols(cols...).Where("user_id = ?", user.UserId).Update(user)
	return err
}
func (m *SysuserDAO) EditUser(user model.SysUser) error {
	var cols = []string{
		"user_name",
		"real_name",
		"phone",
		"email",
		"head_imgurl",
	}
	_, err := m.db.Cols(cols...).Where("user_id = ?", user.UserId).Update(user)
	return err
}

func (m *SysuserDAO) BindUserToOrg(userId, orgId string) error {
	var user = model.SysUser{
		UserId: userId,
		OrgId:  orgId,
	}
	var cols = []string{
		"org_id",
	}
	_, err := m.db.Cols(cols...).Where("user_id=?", user.UserId).Update(user)
	return err
}

func (m *SysuserDAO) ChangePassword(userId, pwd string) error {
	var user = model.SysUser{
		UserId: userId,
		Pwd:    pwd,
	}
	var cols = []string{
		"pwd",
	}
	_, err := m.db.Cols(cols...).Where("user_id=?", user.UserId).Update(user)
	return err
}

func (m *SysuserDAO) GetAppIdByOrgId(orgId string) (string, error) {
	var config []model.SysWechatConf
	sql := `SELECT
	* 
FROM
	sys_wechat_conf a
	INNER JOIN sys_org b ON b.wechat_id = a.conf_id 
WHERE
	org_id = '` + orgId + `'`
	err := m.db.Sql(sql).Find(&config)
	if len(config) > 0 {
		return config[0].Appid, err
	}
	return "", err
}
func (m *SysuserDAO) GetOrgAuthByUserId(userId string) (bool, error) {
	var org []model.SysOrg
	sql := `SELECT
	a.* 
FROM
	sys_org a
	INNER JOIN sys_user b ON a.org_id = b.org_id 
WHERE
	b.user_id = '` + userId + `'`
	err := m.db.Sql(sql).Find(&org)
	if len(org) <= 0 {
		return false, err
	} else {
		if org[0].OrgId == "" {
			return false, err
		}
	}
	return true, err

}