package system

import (
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	"github.com/rdlucklib/rdluck_tools/paging"
	"strings"
	"time"
)

type AdminItem struct {
	AdminId                 int    `description:"系统用户id"`
	AdminName               string `description:"系统用户名称"`
	RealName                string `description:"系统用户姓名"`
	Password                string
	LastUpdatedPasswordTime string `json:"-"`
	Enabled                 int    `description:"1:有效,0:禁用"`
	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 `json:"-" description:"部门名称"`
	TeamId                  int    `description:"三级id"`
	GroupId                 int    `description:"分组id"`
	GroupName               string `json:"-" description:"分组名称"`
	Authority               int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
	Position                string `description:"职位"`
	DepartmentGroup         string `description:"部门分组"`
	LabelVal                int    `description:"标签:1:超级管理员,2:管理员,3:部门经理,4:组长,5:ficc销售主管"`
	ResearchGroupName       string `description:"研究方向分组名称"`
	Province                string `description:"省"`
	ProvinceCode            string `description:"省编码"`
	City                    string `description:"市"`
	CityCode                string `description:"市编码"`
	EmployeeId              string `description:"员工工号(钉钉/每刻报销)"`
}

func GetSysuserList(condition string, pars []interface{}, startSize, pageSize int) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	sql += `ORDER BY created_time DESC LIMIT ?,?`
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

func GetSysuserListCount(condition string, pars []interface{}) (count int, err error) {
	o := orm.NewOrm()
	sql := `SELECT COUNT(1) AS count FROM admin WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	err = o.Raw(sql, pars).QueryRow(&count)
	return
}

type AdminRespItem struct {
	AdminId                 int    `description:"系统用户id"`
	AdminName               string `description:"系统用户名称"`
	RealName                string `description:"系统用户姓名"`
	Password                string
	LastUpdatedPasswordTime string `json:"-"`
	Enabled                 int    `description:"1:有效,0:禁用"`
	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 `json:"-" description:"部门名称"`
	parentId                int    `description:"父级id"`
	GroupId                 int    `description:"分组id"`
	GroupName               string `json:"-" description:"分组名称"`
	Authority               int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
	Position                string `description:"职位"`
	DepartmentGroup         string `description:"部门分组"`
	LabelVal                int    `description:"标签:1:超级管理员,2:管理员,3:部门经理,4:组长,5:ficc销售主管"`
}

type SysuserListResp struct {
	List   []*AdminItem
	Paging *paging.PagingItem `description:"分页数据"`
}

type SysuserAddReq struct {
	AdminName    string `description:"系统用户名称"`
	AdminAvatar  string `description:"用户头像"`
	RealName     string `description:"系统用户姓名"`
	Password     string `description:"密码"`
	Mobile       string `description:"手机号"`
	RoleId       int    `description:"角色id"`
	DepartmentId int    `description:"部门id"`
	GroupId      int    `description:"分组id"`
	TeamId       int    `description:"小组id"`
	//Authority    int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人"`
	Position         string `description:"职位"`
	ResearchGroupIds string `description:"研究方向分组IDs"`
	Province         string `description:"省"`
	ProvinceCode     string `description:"省编码"`
	City             string `description:"市"`
	CityCode         string `description:"市编码"`
	EmployeeId       string `description:"员工工号(钉钉/每刻报销)"`
}

func GetSysAdminCount(adminName string) (count int, err error) {
	sql := `SELECT COUNT(1) AS count FROM admin WHERE admin_name=? `
	o := orm.NewOrm()
	err = o.Raw(sql, adminName).QueryRow(&count)
	return
}

func GetSysAdminByName(adminName string) (item *Admin, err error) {
	sql := `SELECT * FROM admin WHERE admin_name=? `
	o := orm.NewOrm()
	err = o.Raw(sql, adminName).QueryRow(&item)
	return
}

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

func AddAdmin(item *Admin) (err error) {
	o := orm.NewOrm()
	adminId, err := o.Insert(item)
	item.AdminId = int(adminId)
	return
}

type SysuserEditReq struct {
	AdminId      int    `description:"系统用户id"`
	AdminName    string `description:"系统用户名称"`
	AdminAvatar  string `description:"用户头像"`
	RealName     string `description:"系统用户姓名"`
	Password     string `description:"密码"`
	Mobile       string `description:"手机号"`
	RoleId       int    `description:"角色id"`
	DepartmentId int    `description:"部门id"`
	GroupId      int    `description:"分组id"`
	TeamId       int    `description:"小组id"`
	Enabled      int    `description:"1:有效,0:禁用"`
	//Authority    int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人"`
	Position         string `description:"职位"`
	ResearchGroupIds string `description:"研究方向分组IDs"`
	Province         string `description:"省"`
	ProvinceCode     string `description:"省编码"`
	City             string `description:"市"`
	CityCode         string `description:"市编码"`
	EmployeeId       string `description:"员工工号(钉钉/每刻报销)"`
}

// 用户状态编辑
type SysuserEditEnabledReq struct {
	AdminId int `description:"系统用户id"`
	Enabled int `description:"1:有效,0:禁用"`
}

func EditAdmin(item *Admin) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE admin
			SET
			  admin_name= ?,
			  real_name = ?,
			  password = ?,
			  last_updated_password_time = NOW(),
			  email = ?,
			  last_updated_time = NOW(),
			  mobile = ?,
			  role_type = ?,
			  role_id = ?,
			  role_name = ?,
			  department_id = ?,
			  department_name = ?,
			  group_id = ?,
			  group_name = ?,
			  authority = ?,
			  position = ?,
			  role_type_code=?,
			  enabled=?,
			  admin_avatar = ?,
			  province=?,
			  province_code=?,
			  city=?,
			  city_code=?,
			  employee_id = ?
			WHERE admin_id = ? `
	_, err = o.Raw(sql, item.AdminName, item.RealName, item.Password, item.Email, item.Mobile, item.RoleType, item.RoleId, item.RoleName, item.DepartmentId, item.DepartmentName,
		item.GroupId, item.GroupName, item.Authority, item.Position, item.RoleTypeCode, item.Enabled, item.AdminAvatar, item.Province, item.ProvinceCode, item.City, item.CityCode, item.EmployeeId, item.AdminId).Exec()
	return
}

// 变更状态
func EditAdminEnabled(item *Admin) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE admin
			SET
			  last_updated_time = NOW(),enabled=? WHERE admin_id = ? `
	_, err = o.Raw(sql, item.Enabled, item.AdminId).Exec()
	return
}

// DisableAdmin 禁用用户
func DisableAdmin(adminId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE admin
			SET
			  last_updated_time = NOW(),disable_time=now(),enabled=0 WHERE admin_id = ? `
	_, err = o.Raw(sql, adminId).Exec()
	return
}

type SysuserDeleteReq struct {
	AdminId int `description:"系统用户id"`
}

func DeleteSysuser(adminId int) (err error) {
	sql := `DELETE FROM admin WHERE admin_id=? `
	o := orm.NewOrm()
	_, err = o.Raw(sql, adminId).Exec()
	return
}

// GetSysAdminCountByMobile 查询系统中是否存在该手机号(如果有传入用户id,那么排除该用户)
func GetSysAdminCountByMobile(mobile string, adminId int) (count int, err error) {
	sql := `SELECT COUNT(1) AS count FROM admin WHERE mobile=? `
	if adminId > 0 {
		sql += ` AND admin_id != ` + fmt.Sprint(adminId)
	}
	o := orm.NewOrm()
	err = o.Raw(sql, mobile).QueryRow(&count)
	return
}

func GetSysUserItems(condition string, pars []interface{}) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	sql += `ORDER BY last_updated_time DESC `
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

func GetSysUserItemsOrderByCreated(condition string, pars []interface{}) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	sql += ` ORDER BY created_time DESC `
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}
func GetSysUserItemsList(condition string, pars []interface{}, startSize, pageSize int) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	sql += ` ORDER BY created_time DESC limit ?,?`
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}
func GetSysUserItemsTotal(condition string, pars []interface{}) (total int64, err error) {
	o := orm.NewOrm()
	sql := `SELECT count(*) FROM admin WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	err = o.Raw(sql, pars).QueryRow(&total)
	return
}

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

// GetDepartmentGroupSysUserList 根据部门id和分组id获取系统用户列表
func GetDepartmentGroupSysUserList(departmentId, groupId int, roleTypeCodes string) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE department_id = ? and group_id=? and enabled=1 `
	if roleTypeCodes != "" {
		sql += ` and role_type_code in (` + roleTypeCodes + `) `
	}
	sql += ` ORDER BY created_time asc `
	_, err = o.Raw(sql, departmentId, groupId).QueryRows(&items)
	return
}

// GetGrooupsysUserList 根据大组id和小组id获取系统用户列表
func GetGrooupsysUserList(groupId int, roleTypeCodes string, enabled int) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE group_id = ? `
	if roleTypeCodes != "" {
		sql += ` and role_type_code in (` + roleTypeCodes + `) `
	}
	if enabled >= 0 {
		sql += fmt.Sprint(` AND enabled=`, enabled, ` `)
	}
	sql += ` ORDER BY created_time asc `
	_, err = o.Raw(sql, groupId).QueryRows(&items)
	return
}

// GetSysAdminByIdSlice 根据账户id列表获取账户信息列表
func GetSysAdminByIdSlice(adminIdList []string) (items []*Admin, err error) {
	if len(adminIdList) <= 0 {
		return
	}
	sql := `SELECT * FROM admin WHERE admin_id in (` + strings.Join(adminIdList, ",") + `) `
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// GetTeamSysUserList 根据小组id获取系统用户列表
func GetTeamSysUserList(teamId, enabled int) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE group_id=? `
	if enabled >= 0 {
		sql += fmt.Sprint(` AND enabled=`, enabled, ` `)
	}
	sql += ` ORDER BY created_time DESC `
	_, err = o.Raw(sql, teamId).QueryRows(&items)
	return
}

// GetTeamSysUserList 根据小组id获取系统用户列表
func GetTeamSysUserListByIds(ids string) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE group_id IN (` + ids + `) ORDER BY created_time DESC `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func GetGroupIdByParentId(groupId int) (items []*string, err error) {
	o := orm.NewOrm()
	sql := `SELECT group_id FROM sys_group WHERE parent_id=? ORDER BY create_time DESC `
	_, err = o.Raw(sql, groupId).QueryRows(&items)
	return
}

// GetSysUserByParentIdGroupId 查询主管下的所有组员
func GetSysUserByParentIdGroupId(groupId int) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `select real_name, role_id, role_type_code, group_id, admin_id from admin where group_id in (SELECT group_id from sys_group where parent_id=?) OR group_id=?`
	_, err = o.Raw(sql, groupId, groupId).QueryRows(&items)
	return
}
func GetAdminByGroupId(groupId int) (items []*AdminItem, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE group_id=? ORDER BY created_time DESC`
	_, err = o.Raw(sql, groupId).QueryRows(&items)
	return
}

// GetSysAdminByIds 根据主键集合获取管理员信息
func GetSysAdminByIds(adminIds string) (items []*Admin, err error) {
	if adminIds == "" {
		return
	}
	o := orm.NewOrm()
	sql := `SELECT * FROM admin WHERE admin_id IN (` + adminIds + `)`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

type OpenIdList struct {
	OpenId  string
	AdminId int
}

// GetAdminOpenIdListByMobile 根据手机号获取用户的openid列表
func GetAdminOpenIdListByMobile(mobile string) (items []*OpenIdList, err error) {
	sql := `SELECT admin_id, open_id FROM admin 
          WHERE open_id != "" and mobile=? `
	_, err = orm.NewOrm().Raw(sql, mobile).QueryRows(&items)
	return
}

// ResearcherAdminAndUser 研究员admin信息及wx_user信息
type ResearcherAdminAndUser struct {
	UserId    int    `description:"用户ID"`
	UserName  string `description:"用户名称"`
	AdminId   int    `description:"管理员ID"`
	AdminName string `description:"管理员姓名"`
	OpenId    string `description:"openid"`
}

// GetResearcherAdminAndWxUserByAdminId 通过adminId获取研究员admin及user信息
func GetResearcherAdminAndWxUserByAdminId(adminId int) (item *ResearcherAdminAndUser, err error) {
	sql := `SELECT
				a.admin_id,
				a.real_name AS admin_name,
				a.open_id,
				b.user_id,
				b.real_name AS user_name
			FROM
				admin AS a
			JOIN wx_user AS b ON a.mobile = b.mobile
			WHERE
				a.admin_id = ? AND a.open_id != ""`
	err = orm.NewOrm().Raw(sql, adminId).QueryRow(&item)
	return
}

// 获取本组的销售ID
func GetSelleridWhichGroup(companyId, productId int) (adminId string, err error) {
	o := orm.NewOrm()
	sql := ` SELECT
			GROUP_CONCAT( DISTINCT admin_id SEPARATOR ',' ) AS adminId
			FROM
			admin
			WHERE
			group_id IN (
			SELECT
			a.group_id
			FROM
			company_product AS a
			INNER JOIN admin AS b ON a.seller_id = b.admin_id
			WHERE
			a.company_id = ?
			AND a.product_id = ?
)`
	err = o.Raw(sql, companyId, productId).QueryRow(&adminId)
	return
}