package system

import (
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	"hongze/hz_eta_api/utils"
	"strings"
	"time"
)

type LoginReq struct {
	Username   string `description:"账号"`
	Password   string `description:"密码"`
	IsRemember bool   `description:"是否属于受信设备"`
}

type LoginResp struct {
	Authorization   string
	AdminName       string `description:"系统用户名称"`
	RealName        string `description:"系统用户姓名"`
	RoleName        string `description:"角色名称"`
	RoleTypeCode    string `description:"角色类型编码"`
	SysRoleTypeCode string `description:"角色类型编码"`
	AdminId         int    `description:"系统用户id"`
	ProductName     string `description:"产品名称:admin,ficc,权益"`
	Authority       int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
}

type Admin struct {
	AdminId                   int    `orm:"column(admin_id);pk" description:"系统用户id"`
	AdminName                 string `description:"系统用户名称"`
	AdminAvatar               string `description:"用户头像"`
	RealName                  string `description:"系统用户姓名"`
	Password                  string `json:"-"`
	LastUpdatedPasswordTime   string `json:"-"`
	Enabled                   int
	Email                     string `description:"系统用户邮箱"`
	LastLoginTime             string
	CreatedTime               time.Time
	LastUpdatedTime           string
	Role                      string    `description:"系统用户角色"`
	Mobile                    string    `description:"手机号"`
	RoleType                  int       `description:"角色类型:1需要录入指标,0:不需要"`
	RoleId                    int       `description:"角色ID"`
	RoleName                  string    `description:"角色名称"`
	RoleTypeCode              string    `description:"角色类型编码"`
	DepartmentId              int       `description:"部门id"`
	DepartmentName            string    `description:"部门名称"`
	GroupId                   int       `description:"分组id"`
	GroupName                 string    `description:"分组名称"`
	Authority                 int       `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,3:超级管理员,4:ficc销售组长"`
	Position                  string    `description:"职位"`
	DisableTime               time.Time `description:"禁用时间"`
	ChartPermission           int8      `description:"图表权限id"`
	OpenId                    string    `description:"弘则部门公众号的openid"`
	UnionId                   string    `description:"微信公众平台唯一标识"`
	EdbPermission             int8      `description:"指标库操作权限,0:只能操作 自己的,1:所有指标可操作"`
	MysteelChemicalPermission int8      `description:"钢联化工指标操作权限,0:只能操作 自己的,1:所有指标可操作"`
	PredictEdbPermission      int8      `description:"预测指标库操作权限,0:只能操作 自己的,1:所有预测指标可操作"`
	Province                  string    `description:"省"`
	ProvinceCode              string    `description:"省编码"`
	City                      string    `description:"市"`
	CityCode                  string    `description:"市编码"`
	EmployeeId                string    `description:"员工工号(钉钉/每刻报销)"`
}

// Update 更新用户基础信息
func (item *Admin) Update(cols []string) (err error) {
	o := orm.NewOrm()
	_, err = o.Update(item, cols...)
	return
}

func CheckSysUser(userName, password string) (item *Admin, err error) {
	sql := ` SELECT a.*,b.role_type_code FROM admin AS a
			 INNER JOIN sys_role AS b ON a.role_id=b.role_id WHERE a.admin_name=? AND a.password=? LIMIT 1`
	o := orm.NewOrm()
	err = o.Raw(sql, userName, password).QueryRow(&item)
	return
}

func GetSysUserById(sysUserId int) (item *Admin, err error) {
	sql := `SELECT * FROM admin WHERE admin_id=? LIMIT 1`
	o := orm.NewOrm()
	err = o.Raw(sql, sysUserId).QueryRow(&item)
	return
}

// 根据权限code获取系统用户列表
func GetAdminListByRoleCode(roleTypeCode string) (items []*Admin, err error) {
	sql := `SELECT * FROM admin WHERE role_type_code=? and enabled=1 `
	o := orm.NewOrm()
	_, err = o.Raw(sql, roleTypeCode).QueryRows(&items)
	return
}

// 根据权限id获取系统用户列表
func GetAdminListByRoleId(roleId string) (items []*Admin, err error) {
	sql := `SELECT * FROM admin WHERE role_id=? and enabled=1 `
	o := orm.NewOrm()
	_, err = o.Raw(sql, roleId).QueryRows(&items)
	return
}

// GetAdminListByIds 根据用户id字符串获取系统用户列表
func GetAdminListByIds(ids string) (items []*Admin, err error) {
	sql := `SELECT * FROM admin WHERE admin_id in (` + ids + `) and enabled=1 `
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func ModifyPwd(sysUserId int, newPwd string) (err error) {
	sql := `UPDATE admin SET password=?,last_updated_time=NOW() WHERE admin_id=? `
	o := orm.NewOrm()
	_, err = o.Raw(sql, newPwd, sysUserId).Exec()
	return
}

type ModifyPwdReq struct {
	OldPwd string `description:"旧密码"`
	NewPwd string `description:"新密码"`
}

func GetAdminList() (items []*Admin, err error) {
	sql := `SELECT * FROM admin`
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// GetSysUserByMobile 根据手机号获取管理信息
func GetSysUserByMobile(mobile string) (item *Admin, err error) {
	sql := `SELECT * FROM admin WHERE mobile = ? LIMIT 1`
	o := orm.NewOrm()
	err = o.Raw(sql, mobile).QueryRow(&item)
	return
}

// 通过用户姓名跟身份获取管理员信息
func CheckSysUserByName(userName, roleTypeCode string) (item *Admin, err error) {
	sql := ` SELECT a.*  FROM admin AS a WHERE a.real_name=? AND a.role_type_code=? LIMIT 1`
	o := orm.NewOrm()
	err = o.Raw(sql, userName, roleTypeCode).QueryRow(&item)
	return
}

// GetAdminListByGroupId 根据分组id获取系统用户列表
func GetAdminListByGroupId(groupId int) (items []*Admin, err error) {
	sql := `SELECT * FROM admin WHERE group_id=? and enabled=1 `
	o := orm.NewOrm()
	_, err = o.Raw(sql, groupId).QueryRows(&items)
	return
}

// AdminWxUserRelation 管理员-微信用户关联
type AdminWxUserRelation struct {
	AdminId   int    `json:"admin_id"`
	AdminName string `json:"admin_name"`
	RealName  string `json:"real_name"`
	UserId    int    `json:"user_id"`
}

// GetAdminWxUserRelationByWxUserIds 通过微信用户及平台获取后台关联信息
func GetAdminWxUserRelationByWxUserIds(platform int, userIds []int) (list []*AdminWxUserRelation, err error) {
	userLen := len(userIds)
	if userLen == 0 {
		return
	}
	o := orm.NewOrm()
	sql := `SELECT
				ad.admin_id, ad.admin_name, ad.real_name, wu.user_id
			FROM
				admin AS ad
			JOIN wx_user AS wu ON ad.mobile = wu.mobile
			JOIN user_record AS ur ON wu.user_id = ur.user_id AND ur.create_platform = ?
			WHERE
				wu.user_id IN (` + utils.GetOrmInReplace(userLen) + `)`
	_, err = o.Raw(sql, platform, userIds).QueryRows(&list)
	return
}

// GetAdminListByIdList 根据用户id列表获取系统用户列表
func GetAdminListByIdList(idList []int) (items []*Admin, err error) {
	lenNum := len(idList)
	if lenNum <= 0 {
		return
	}
	sql := `SELECT * FROM admin WHERE admin_id in (` + utils.GetOrmInReplace(lenNum) + `) and enabled=1 `
	o := orm.NewOrm()
	_, err = o.Raw(sql, idList).QueryRows(&items)
	return
}

// GetAdminListByIdList 根据用户id列表获取系统用户列表
func GetAdminListByIdListWithoutEnable(idList []int) (items []*Admin, err error) {
	lenNum := len(idList)
	if lenNum <= 0 {
		return
	}
	sql := `SELECT * FROM admin WHERE admin_id in (` + utils.GetOrmInReplace(lenNum) + `) `
	o := orm.NewOrm()
	_, err = o.Raw(sql, idList).QueryRows(&items)
	return
}

func (item *Admin) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
	o := orm.NewOrm()
	sql := fmt.Sprintf(`SELECT COUNT(1) FROM admin WHERE 1=1 %s`, condition)
	err = o.Raw(sql, pars).QueryRow(&count)
	return
}

func (item *Admin) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*Admin, err error) {
	o := orm.NewOrm()
	fields := strings.Join(fieldArr, ",")
	if len(fieldArr) == 0 {
		fields = `*`
	}
	order := `ORDER BY created_time DESC`
	if orderRule != "" {
		order = ` ORDER BY ` + orderRule
	}
	sql := fmt.Sprintf(`SELECT %s FROM admin WHERE 1=1 %s %s`, fields, condition, order)
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}