package system

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

type SysGroupAddReq struct {
	DepartmentId int    `description:"部门Id"`
	GroupName    string `description:"分组名称,多个用英文逗号隔开"`
}

type SysGroup struct {
	GroupId      int       `orm:"column(group_id);pk" description:"分组ID"`
	DepartmentId int       `description:"部门Id"`
	ParentId     int       `description:"父级Id"`
	GroupName    string    `description:"分组名称"`
	Sort         int       `description:"排序"`
	CreateTime   time.Time `description:"创建时间"`
}

func GetSysGroupCount(departmentId int, groupName string) (count int, err error) {
	sql := `SELECT COUNT(1) AS count FROM sys_group WHERE department_id=? AND group_name=? `
	o := orm.NewOrm()
	err = o.Raw(sql, departmentId, groupName).QueryRow(&count)
	return
}

func AddSysGroup(item *SysGroup) (lastId int64, err error) {
	o := orm.NewOrm()
	lastId, err = o.Insert(item)
	return
}

type SysGroupEditReq struct {
	GroupId   int    `description:"分组ID"`
	GroupName string `description:"分组名称"`
}

func GetSysGroupById(groupId int) (item *SysGroup, err error) {
	sql := `SELECT * FROM sys_group WHERE group_id=? `
	o := orm.NewOrm()
	err = o.Raw(sql, groupId).QueryRow(&item)
	return
}

func GetSysGroupByName(groupName string) (item *SysGroup, err error) {
	sql := `SELECT * FROM sys_group WHERE group_name=? `
	o := orm.NewOrm()
	err = o.Raw(sql, groupName).QueryRow(&item)
	return
}

func ModifySysGroup(groupName string, groupId int) (err error) {
	o := orm.NewOrm()
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	sql := `UPDATE sys_group SET group_name=? WHERE group_id=? `
	_, err = to.Raw(sql, groupName, groupId).Exec()
	sql = `UPDATE admin SET group_name=? WHERE group_id=? `
	_, err = to.Raw(sql, groupName, groupId).Exec()
	return
}

type SysGroupDeleteReq struct {
	GroupId int `description:"分组ID"`
}

func DeleteSysGroup(groupId int) (err error) {
	sql := `DELETE FROM sys_group WHERE group_id=? `
	o := orm.NewOrm()
	_, err = o.Raw(sql, groupId).Exec()
	return
}

// 因前端显示需要，TopId字段用来当做一级部门id，DepartmentId为当前分组id
type SysGroupList struct {
	GroupId      int            `orm:"column(group_id);pk" json:"DepartmentId" description:"分组ID"`
	ParentId     int            `json:"ParentId" description:"父级ID"`
	DepartmentId int            `json:"TopId" description:"部门Id"`
	GroupName    string         `json:"DepartmentName" description:"分组名称"`
	Child        []*SysTeamList `description:"小组"`
	CreateTime   time.Time      `description:"创建时间"`
	IsGroup      bool           `description:"是否为二级部门"`
}

func GetSysGroupByDepartmentId(departmentId int) (items []*SysGroupList, err error) {
	sql := `SELECT * FROM sys_group WHERE department_id=? AND parent_id=0 ORDER BY sort ASC, create_time ASC`
	o := orm.NewOrm()
	_, err = o.Raw(sql, departmentId).QueryRows(&items)
	return
}

// GetSysGroupListByDepartmentId 获取该部门下的所有分组（包含大小分组，不包含 “无” 这个分组）
func GetSysGroupListByDepartmentId(departmentId int) (items []*SysGroupList, err error) {
	sql := `SELECT * FROM sys_group WHERE department_id=? AND group_name<>'无' ORDER BY sort ASC, create_time ASC`
	o := orm.NewOrm()
	_, err = o.Raw(sql, departmentId).QueryRows(&items)
	return
}

func ClearSysUserGroup(groupId int) (err error) {
	sql := `UPDATE admin SET group_id=0,group_name='' WHERE group_id=? `
	o := orm.NewOrm()
	_, err = o.Raw(sql, groupId).Exec()
	return
}

func GetSysGroupByDirectorId(directorId int) (items []*SysGroupList, err error) {
	sql := `SELECT * FROM sys_group WHERE group_id=? ORDER BY sort ASC, create_time ASC`
	o := orm.NewOrm()
	_, err = o.Raw(sql, directorId).QueryRows(&items)
	return
}

// GetSysGroupByGroupId 销售主管用，查找销售主管所在大组的名称
func GetSysGroupByGroupId(groupId int) (items []*SysGroupList, err error) {
	sql := `SELECT * FROM sys_group WHERE department_id=2 AND parent_id=0 AND group_id=? ORDER BY sort ASC, create_time ASC`
	o := orm.NewOrm()
	_, err = o.Raw(sql, groupId).QueryRows(&items)
	return
}

// GetChildSysGroupByGroupId 通过上级分组id获取下级的分组id
func GetChildSysGroupByGroupId(groupId int) (items []*SysGroup, err error) {
	sql := `SELECT * FROM sys_group WHERE parent_id=? ORDER BY sort ASC, create_time ASC`
	o := orm.NewOrm()
	_, err = o.Raw(sql, groupId).QueryRows(&items)
	return
}

type SysFullGroup struct {
	GroupId         int       `orm:"column(group_id);pk" description:"分组ID"`
	DepartmentId    int       `description:"部门Id"`
	ParentId        int       `description:"父级Id"`
	GroupName       string    `description:"分组名称"`
	ParentGroupName string    `description:"父级分组名称"`
	DepartmentName  string    `description:"部门名称"`
	CreateTime      time.Time `description:"创建时间"`
}

// GetFullGroup 获取完整的分组信息
func GetFullGroup() (list []*SysFullGroup, err error) {
	sql := `SELECT s.*,g.group_name as parent_group_name , d.department_name
from sys_group s 
LEFT JOIN sys_group g on s.parent_id=g.group_id
LEFT JOIN sys_department d on s.department_id=d.department_id ORDER BY s.sort ASC, s.create_time ASC`
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

type SysGroupSortReq struct {
	//ParentId      int   `description:"上级部门/分组ID"`
	DepartmentIds []int `description:"移动后的一级ID排序"`
	GroupIds      []int `description:"移动后的二级ID排序"`
	TeamIds       []int `description:"移动后的三级ID排序"`
}

type GroupSort struct {
	GroupId int
	Sort    int
}

func MultiUpdateGroupSort(items []*GroupSort) (err error) {
	if len(items) == 0 {
		return
	}
	o := orm.NewOrm()
	p, err := o.Raw("UPDATE sys_group SET sort = ? WHERE group_id = ?").Prepare()
	if err != nil {
		return
	}
	defer func() {
		_ = p.Close()
	}()
	for _, v := range items {
		_, err = p.Exec(v.Sort, v.GroupId)
		if err != nil {
			return
		}
	}
	return
}

func GetGroupByDepartmentId(departmentId int) (list []*SysFullGroup, err error) {
	sql := `SELECT
				s.*, g.group_name AS parent_group_name,
				d.department_name
			FROM
				sys_group s
			LEFT JOIN sys_group g ON s.parent_id = g.group_id
			LEFT JOIN sys_department d ON s.department_id = d.department_id
			WHERE
				s.department_id = ?
			ORDER BY
				s.sort ASC,
				s.create_time ASC`
	o := orm.NewOrm()
	_, err = o.Raw(sql, departmentId).QueryRows(&list)
	return
}

type RoadshowGroupResp struct {
	List []RoadshowGroups
}

type RoadshowGroups struct {
	GroupId   int                    `description:"分组ID"`
	GroupName string                 `description:"分组名称"`
	Child     []RoadshowGroupSellers `description:"销售"`
}

type RoadshowGroupSellers struct {
	GroupId   int    `description:"大组ID"`
	TeamId    int    `description:"小组ID"`
	AdminId   int    `description:"销售ID"`
	AdminName string `description:"销售名称"`
}
