// 模块控制接口-用户
// 秒寻科技
// zt 2024-01-04

package userhandler

import (
	"ipsomc/core/dao/mysql/mysqlmodel"
	"ipsomc/core/gin/bind"
	"ipsomc/core/gin/resp"
	"ipsomc/core/user/userapi"
	"ipsomc/core/user/userlogic"
	"ipsomc/core/user/usermodel"

	"github.com/gin-gonic/gin"
)

type UserHan struct {
	userApi userapi.UserApi
	userLgc userlogic.UserLgc
	bindApi bind.BindApi
}

// 操作员登录
func (obj *UserHan) OperatorLoginHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)
	respModel := new(usermodel.RspOperator)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据错误")
		return
	}

	//登录
	if err := obj.userLgc.OperatorLogin(dataModel, respModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	resp.RespData(c, respModel) //返回数据
}

// 增加操作员
func (obj *UserHan) AddOperatorHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据错误")
		return
	}
	if dataModel.CompanyID == 0 {
		dataModel.CompanyID = dataModel.BelongingCompanyID
	}

	//保存数据
	if err := obj.userApi.AddOperator(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespId(c, dataModel.ID)
}

// 修改
func (obj *UserHan) UpdateOperatorHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)
	dataMap := make(map[string]interface{})

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Map(c, dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//保存数据
	if err := obj.userApi.UpdateOperator(dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespOk(c)
}

// 修改密码
func (obj *UserHan) UpdateOperatorPwdHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)
	dataMap := make(map[string]interface{})

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Map(c, dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//保存数据
	if err := obj.userApi.UpdateOperatorPwd(dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespOk(c)
}

// 重置密码
func (obj *UserHan) ResetOperatorPwdHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//保存数据
	if err := obj.userApi.ResetOperatorPwd(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespData(c, dataModel)
}

// 删除
func (obj *UserHan) DeleteOperatorHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	if err := obj.userApi.DeleteOperator(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespOk(c)
}

// 查询单条记录
func (obj *UserHan) GetOperatorByIdHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	if err := obj.userApi.GetOperatorById(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespData(c, dataModel)
}

// 分页查询
func (obj *UserHan) GetOperatorPageListHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)
	pageListParam := new(mysqlmodel.PageListParam)
	dataList := []usermodel.Operator{}

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2PageQuery(c, pageListParam); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	pageListData, err := obj.userApi.GetOperatorPageList(dataModel, pageListParam, &dataList)
	if err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//密码脱敏
	for index := range dataList {
		dataList[index].Password = "******"
	}
	pageListData.Items = dataList

	resp.RespList(c, pageListData)
}

// 获得用户访问权限，包括页面访问权限和按钮访问权限
func (obj *UserHan) GetOperatorPermissionHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)
	var permission usermodel.RspOperatorPermission

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	permission, err := obj.userLgc.GetOperatorPermissionLgc(dataModel)
	if err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespData(c, permission)
}

// 获得公司系统管理员，每家公司只有一个系统管理员
func (obj *UserHan) GetSysOperatorByCompanyIdHan(c *gin.Context) {
	dataModel := new(usermodel.Operator)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	sysOperator, err := obj.userApi.GetSysOperatorByCompanyId(dataModel.BelongingCompanyID)
	if err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespData(c, sysOperator)
}

/**************************************上面是操作员接口***************************************/
/**************************************下面管理角色接口***************************************/
// 增加操作员
func (obj *UserHan) AddRoleHan(c *gin.Context) {
	dataModel := new(usermodel.Role)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据错误")
		return
	}

	//保存数据
	if err := obj.userApi.AddRole(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespId(c, dataModel.ID)
}

// 修改
func (obj *UserHan) UpdateRoleHan(c *gin.Context) {
	dataModel := new(usermodel.Role)
	dataMap := make(map[string]interface{})

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Map(c, dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//保存数据
	if err := obj.userApi.UpdateRole(dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespOk(c)
}

// 删除
func (obj *UserHan) DeleteRoleHan(c *gin.Context) {
	dataModel := new(usermodel.Role)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	if err := obj.userApi.DeleteRole(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespOk(c)
}

// 查询单条记录
func (obj *UserHan) GetRoleByIdHan(c *gin.Context) {
	dataModel := new(usermodel.Role)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	if err := obj.userApi.GetRoleId(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespData(c, dataModel)
}

// 分页查询
func (obj *UserHan) GetRolePageListHan(c *gin.Context) {
	dataModel := new(usermodel.Role)
	pageListParam := new(mysqlmodel.PageListParam)
	dataList := []usermodel.Role{}

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2PageQuery(c, pageListParam); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	pageListData, err := obj.userApi.GetRolePageList(dataModel, pageListParam, &dataList)
	if err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	resp.RespList(c, pageListData)
}

/**************************************上面是管理角色接口***************************************/
/**************************************下面管理权限接口***************************************/
// 增加操作员
func (obj *UserHan) AddPermissionHan(c *gin.Context) {
	dataModel := new(usermodel.Permission)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据错误")
		return
	}

	//保存数据
	if err := obj.userApi.AddPermission(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespId(c, dataModel.ID)
}

// 修改
func (obj *UserHan) UpdatePermissionHan(c *gin.Context) {
	dataModel := new(usermodel.Permission)
	dataMap := make(map[string]interface{})

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Map(c, dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//保存数据
	if err := obj.userApi.UpdatePermission(dataModel, dataMap); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespOk(c)
}

// 删除
func (obj *UserHan) DeletePermissionHan(c *gin.Context) {
	dataModel := new(usermodel.Permission)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	if err := obj.userApi.DeletePermission(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespOk(c)
}

// 查询单条记录
func (obj *UserHan) GetPermissionByIdHan(c *gin.Context) {
	dataModel := new(usermodel.Permission)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	if err := obj.userApi.GetPermissionId(dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespData(c, dataModel)
}

// 查询全部
func (obj *UserHan) GetPermissionListHan(c *gin.Context) {
	dataModel := new(usermodel.Permission)

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2Model(c, dataModel); err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	dataList, err := obj.userApi.GetPermissionList(dataModel)
	if err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	//返回数据
	resp.RespData(c, dataList)
}

// 分页查询
func (obj *UserHan) GetPermissionPageListHan(c *gin.Context) {
	dataModel := new(usermodel.Permission)
	pageListParam := new(mysqlmodel.PageListParam)
	dataList := []usermodel.Permission{}

	//把前端数据绑定到模型
	if err := obj.bindApi.Bind2PageQuery(c, pageListParam); err != nil {
		resp.RespFail(c, "数据解析错误")
		return
	}

	pageListData, err := obj.userApi.GetPermissionPageList(dataModel, pageListParam, &dataList)
	if err != nil {
		resp.RespFail(c, err.Error())
		return
	}

	resp.RespList(c, pageListData)
}
