package system

import (
	"spaceofcheng/services/models/model"
	"spaceofcheng/services/models/system"
	"spaceofcheng/services/service"
	"spaceofcheng/services/utils"

	"github.com/astaxie/beego"
)

// RoleServ 系统处理
type RoleServ struct {
	ctx *utils.Context
	dao *system.RoleDAO
}

// NewRoleServ 初始化
func NewRoleServ(ctx *utils.Context) *RoleServ {
	return &RoleServ{
		ctx: ctx,
		dao: system.NewRoleDAO(ctx),
	}
}

// GetRoleList 获取Role列表
func (s *RoleServ) GetRoleList(caseids, name, caseid string, page, pageSize int) (map[string]interface{}, error) {
	if pageSize == 0 {
		pageSize = service.PAGENUM
	}
	if page == 0 {
		page = 1
	}
	roles, err := s.dao.GetRoleList(caseids, name, caseid, page, pageSize)
	if err != nil {
		beego.Error(err)
		return nil, err
	}
	total, err := s.dao.GetRoleCount(caseids, name, caseid)
	if err != nil {
		beego.Error(err)
		return nil, err
	}

	return map[string]interface{}{
		"list":     roles,
		"pagesize": pageSize,
		"pagenum":  total,
		"page":     page,
	}, err
}

// GetRoleByID 根据ID获取角色
func (s *RoleServ) GetRoleByID(roleid string) (*model.SysRole, error) {
	role, err := s.dao.GetRoleByID(roleid)
	if err != nil {
		beego.Error(err)
		return nil, err
	}
	// if role != nil {
	// 	menus, err := s.dao.GetRoleMenuByRoleID(roleid)
	// 	if err != nil {
	// 		beego.Error(err)
	// 		return nil, err
	// 	}
	// 	role.RoleMenu = menus
	// }
	return role, err
}

// GetRoleMeneByID 根据ID获取角色菜单
func (s *RoleServ) GetRoleMeneByID(roleid string) ([]model.SysMenu, error) {
	menus, err := s.dao.GetRoleMenuByRoleID(roleid)
	if err != nil {
		beego.Error(err)
		return nil, err
	}
	return menus, nil
}

// SaveRole 保存角色
func (s *RoleServ) SaveRole(role model.SysRole) (*model.SysRole, error) {
	if role.RoleName == "" {
		return nil, utils.LogError("角色名称不允许为空！")
	}
	var newInfo *model.SysRole
	var err error
	if role.RoleId == "" {
		newInfo, err = s.dao.AddRole(role)
	} else {
		err = s.dao.UpdateRole(role)
		newInfo = &role
	}
	if err != nil {
		beego.Error(err)
		return nil, err
	}

	return newInfo, err
}

// SaveRoleMenu 保存角色菜单
func (s *RoleServ) SaveRoleMenu(roleid, menuids string) error {
	var err error
	err = s.dao.DelRoleMenu(roleid)
	if err != nil {
		beego.Error(err)
		return err
	}
	err = s.dao.SaveRoleMenu(roleid, menuids)
	if err != nil {
		beego.Error(err)
		return err
	}
	err = s.dao.DelUserMenusByRole(roleid)
	if err != nil {
		beego.Error(err)
		return err
	}
	err = s.dao.SaveUserMenus(roleid)
	return err
}

// DelRole 删除角色
func (s *RoleServ) DelRole(Roleid string) error {
	err := s.dao.DeleteRole(Roleid)
	return err
}
