package controller

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
	"github.com/mhaya/game/game_cluster/nodes/webadmin/service"
)

type Role struct {
}

func NewRole() *Role {
	return &Role{}
}

// Add 新增角色
// @Summary 新增角色
// @Description 新增角色
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data body entity.RoleAddReq true "新增角色"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/add [post]
func (r *Role) Add(ctx *gin.Context) {
	req := new(entity.RoleAddReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).Add(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// List 角色列表
// @Summary 角色列表
// @Description 角色列表
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data query entity.RoleListReq true "角色列表"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/list [get]
func (r *Role) List(ctx *gin.Context) {
	req := new(entity.RoleListReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	list, err := new(service.Role).List(ctx, req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code":  200,
		"msg":   "success",
		"data":  list,
		"count": req.Count,
	})
}

// Update 修改角色
// @Summary 修改角色
// @Description 修改角色
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data body entity.RoleUpdateReq true "修改角色"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/update [post]
func (r *Role) Update(ctx *gin.Context) {
	req := new(entity.RoleUpdateReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).Update(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// Del 删除角色
// @Summary 删除角色
// @Description 删除角色
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data query entity.RoleDelReq true "删除角色"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/del [get]
func (r *Role) Del(ctx *gin.Context) {
	req := new(entity.RoleDelReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).Del(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// AddRoleAccess  添加角色权限
// @Summary 添加角色权限
// @Description 添加角色权限
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data body entity.RoleAccessAddReq true "添加角色权限"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/role_access/add [post]
func (r *Role) AddRoleAccess(ctx *gin.Context) {
	req := new(entity.RoleAccessAddReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).AddRoleAccess(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// UpdateRoleAccess 修改角色权限
// @Summary 修改角色权限
// @Description 修改角色权限
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data body entity.RoleAccessUpdateReq true "修改角色权限"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/role_access/update [post]
func (r *Role) UpdateRoleAccess(ctx *gin.Context) {
	req := new(entity.RoleAccessUpdateReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).UpdateRoleAccess(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// DelRoleAccess 删除角色权限
// @Summary 删除角色权限
// @Description 删除角色权限
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data query entity.RoleAccessDelReq true "删除角色权限"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/role_access/del [get]
func (r *Role) DelRoleAccess(ctx *gin.Context) {
	req := new(entity.RoleAccessDelReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).DelRoleAccess(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// GetRoleAccessList 获取角色权限列表根据角色ID
// @Summary 获取角色权限列表根据角色ID
// @Description 获取角色权限列表根据角色ID
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data query entity.RoleAccessListReq true "获取角色权限列表根据角色ID"
// @Success 200 {object} []entity.AccessResp
// @Router /v1/admin/role/role_access/list [get]
func (r *Role) GetRoleAccessList(ctx *gin.Context) {
	req := new(entity.RoleAccessListReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	list, err := new(service.Role).GetRoleAccessList(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
		"data": list,
	})
}

// AddAccess 添加权限路由
// @Summary 添加权限路由
// @Description 添加权限路由
// @Tags 角色-路由
// @Accept application/json
// @Produce application/json
// @Param data body entity.AccessAddReq true "添加权限路由"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/access/add [post]
func (r *Role) AddAccess(ctx *gin.Context) {
	req := new(entity.AccessAddReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).AddAccess(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// DelAccess
// @Summary 删除权限路由
// @Description 删除权限路由
// @Tags 角色-路由
// @Accept application/json
// @Produce application/json
// @Param data query entity.AccessDelReq true "删除权限路由"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/access/del [Get]
func (r *Role) DelAccess(ctx *gin.Context) {
	req := new(entity.AccessDelReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).DelAccess(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})

}

// UpdateAccess  修改权限路由
// @Summary 修改权限路由
// @Description 修改权限路由
// @Tags 角色-路由
// @Accept application/json
// @Produce application/json
// @Param data body entity.AccessUpdateReq true "修改权限路由"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/access/update [post]
func (r *Role) UpdateAccess(ctx *gin.Context) {
	req := new(entity.AccessUpdateReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).UpdateAccess(ctx, *req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// ListAccess 获取权限路由列表
// @Summary 获取权限路由列表
// @Description 获取权限路由列表
// @Tags 角色-路由
// @Accept application/json
// @Produce application/json
// @Param data query entity.AccessListReq true "获取权限路由列表"
// @Success 200 {object} []entity.AccessResp
// @Router /v1/admin/role/access/list [get]
func (r *Role) ListAccess(ctx *gin.Context) {
	req := new(entity.AccessListReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	list, err := new(service.Role).ListAccess(ctx, req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code":  200,
		"msg":   "success",
		"data":  list,
		"total": req.Count,
	})
}

// GetAdminRole
// @Summary 获取该管理员的权限详情
// @Description 获取该管理员的权限详情
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data query entity.AdminBindRoleReq true "获取角色"
// @Success 200 {object} entity.AdminBindRoleResp
// @Router /v1/admin/role/admin_role_info [post]
func (r *Role) GetAdminRole(ctx *gin.Context) {
	req := new(entity.AdminBindRoleReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	list, err := new(service.Role).GetAdminRole(ctx, req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
		"data": list,
	})
	return
}

// AdminBindRole 绑定角色
// @Summary 绑定角色
// @Description 绑定角色
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data body entity.AdminBindRoleReq true "绑定角色"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/admin_bind_role [post]
func (r *Role) AdminBindRole(ctx *gin.Context) {
	req := new(entity.AdminBindRoleReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).AdminBindRole(ctx, req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})

}

// AdminUnBindRole 取消绑定角色
// @Summary 取消绑定角色
// @Description 取消绑定角色
// @Tags 角色
// @Accept application/json
// @Produce application/json
// @Param data body entity.AdminBindRoleReq true "取消绑定角色"
// @Success 200 {object} entity.Response
// @Router /v1/admin/role/admin_unbind_role [post]
func (r *Role) AdminUnBindRole(ctx *gin.Context) {
	req := new(entity.AdminBindRoleReq)
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	err := new(service.Role).AdminUnBindRole(ctx, req)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
	})
}
