package controller

import (
	"cold-delivery/app/admin/model"
	"cold-delivery/app/admin/service"
	"cold-delivery/app/admin/service/dto"
	"cold-delivery/common/actions"
	"cold-delivery/common/global"
	"fmt"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"gogs.baozhida.cn/zoie/OAuth-core/api"
	"gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/user"
)

type SysPostController struct {
	api.Api
}

// GetPage 获取岗位列表
// @Summary 获取岗位列表
// @Description 分页查询岗位列表
// @Tags 岗位管理
// @Param postName query string false "岗位名称"
// @Param postCode query string false "岗位编码"
// @Param status query string false "状态"
// @Param deptId query int false "部门ID"
// @Param page query int false "页码"
// @Param pageSize query int false "每页数量"
// @Success 200 {object} response.Response{data=response.Page{list=[]model.SysPost}} "{"code": 200, "data": [...]}"
// @Router /api/post [get]
// @Security Bearer
func (e SysPostController) GetPage(c *gin.Context) {
	s := service.SysPost{}
	req := dto.SysPostGetPageReq{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.Query).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	p := actions.GetPermissionFromContext(c)
	list := make([]model.SysPost, 0)
	var count int64
	err = s.GetPage(&req, &list, &count, p)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
}

// Get 获取单个岗位详情
// @Summary 获取单个岗位
// @Description 获取岗位详情（含权限菜单ID列表）
// @Tags 岗位管理
// @Param id path int true "岗位ID"
// @Success 200 {object} response.Response{data=model.SysPost} "{"code": 200, "data": {...}}"
// @Router /api/post/{id} [get]
// @Security Bearer
func (e SysPostController) Get(c *gin.Context) {
	s := service.SysPost{}
	req := dto.SysPostGetReq{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, nil).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	p := actions.GetPermissionFromContext(c)
	var postModel model.SysPost
	err = s.Get(&req, &postModel, p)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(postModel, "查询成功")
}

// Insert 新增岗位
// @Summary 新增岗位
// @Description 新增岗位（含菜单权限分配）
// @Tags 岗位管理
// @Param data body dto.SysPostInsertReq true "岗位信息"
// @Success 200 {object} response.Response "{"code": 200, "msg": "添加成功"}"
// @Router /api/post [post]
// @Security Bearer
func (e SysPostController) Insert(c *gin.Context) {
	s := service.SysPost{}
	req := dto.SysPostInsertReq{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	req.SetCreateBy(user.GetUserId(c))

	err = s.Insert(&req)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(req.Id, "添加成功")
}

// Update 修改岗位
// @Summary 修改岗位
// @Description 修改岗位（含菜单权限重新分配）
// @Tags 岗位管理
// @Param data body dto.SysPostUpdateReq true "岗位信息"
// @Success 200 {object} response.Response "{"code": 200, "msg": "更新成功"}"
// @Router /api/post [put]
// @Security Bearer
func (e SysPostController) Update(c *gin.Context) {
	s := service.SysPost{}
	req := dto.SysPostUpdateReq{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	req.SetUpdateBy(user.GetUserId(c))
	p := actions.GetPermissionFromContext(c)

	cb, err := global.LoadPolicy(c)
	if err != nil {
		e.Error(500, err, "Casbin加载失败")
		return
	}

	err = s.Update(&req, p, cb)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(req.Id, "更新成功")
}

// Delete 删除岗位（逻辑删除）
// @Summary 删除岗位
// @Description 删除岗位（逻辑删除，检查是否有用户关联）
// @Tags 岗位管理
// @Param data body dto.SysPostDeleteReq true "岗位ID"
// @Success 200 {object} response.Response "{"code": 200, "msg": "删除成功"}"
// @Router /api/post [delete]
// @Security Bearer
func (e SysPostController) Delete(c *gin.Context) {
	s := service.SysPost{}
	req := dto.SysPostDeleteReq{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	p := actions.GetPermissionFromContext(c)

	cb, err := global.LoadPolicy(c)
	if err != nil {
		e.Error(500, err, "Casbin加载失败")
		return
	}

	err = s.Remove(&req, p, cb)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(req.Id, "删除成功")
}

// GetAll 获取所有岗位（下拉选择用）
// @Summary 获取所有岗位
// @Description 获取所有岗位（用于下拉选择）
// @Tags 岗位管理
// @Param deptId query int false "部门ID"
// @Success 200 {object} response.Response{data=[]model.SysPost} "{"code": 200, "data": [...]}"
// @Router /api/post/all [get]
// @Security Bearer
func (e SysPostController) GetAll(c *gin.Context) {
	s := service.SysPost{}
	err := e.MakeContext(c).
		MakeOrm().
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	p := actions.GetPermissionFromContext(c)
	// 从前端请求参数获取 deptId，不用当前登录用户的部门ID
	deptIdStr := c.Query("deptId")
	deptId := 0
	if deptIdStr != "" {
		fmt.Sscanf(deptIdStr, "%d", &deptId)
	}

	list := make([]model.SysPost, 0)
	err = s.GetAll(deptId, &list, p)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(list, "查询成功")
}

// GetMenuTree 获取菜单权限树
// @Summary 获取菜单权限树
// @Description 获取完整菜单树（用于权限分配界面）
// @Tags 岗位管理
// @Success 200 {object} response.Response{data=[]dto.MenuLabel} "{"code": 200, "data": [...]}"
// @Router /api/post/menu-tree [get]
// @Security Bearer
func (e SysPostController) GetMenuTree(c *gin.Context) {
	s := service.SysPost{}
	err := e.MakeContext(c).
		MakeOrm().
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	tree, err := s.GetMenuTree()
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(tree, "查询成功")
}

// GetPostMenuIds 获取岗位已分配的菜单ID
// @Summary 获取岗位菜单权限
// @Description 获取岗位已分配的菜单ID列表
// @Tags 岗位管理
// @Param id path int true "岗位ID"
// @Success 200 {object} response.Response{data=dto.SysPostMenuIdsResp} "{"code": 200, "data": {"menuIds": [...]}}"
// @Router /api/post/{id}/menu-ids [get]
// @Security Bearer
func (e SysPostController) GetPostMenuIds(c *gin.Context) {
	s := service.SysPost{}
	req := dto.SysPostGetReq{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, nil).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	menuIds, err := s.GetPostMenuIds(req.Id)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(dto.SysPostMenuIdsResp{MenuIds: menuIds}, "查询成功")
}

// GetPostNames 根据ID列表批量获取岗位名称
// @Summary 根据ID列表获取岗位名称
// @Description 根据岗位ID列表批量查询岗位名称，返回 id→名称 的映射
// @Tags 岗位管理
// @Param ids query string true "岗位ID列表（逗号分隔，如 1,2,3）"
// @Success 200 {object} response.Response{data=map[int]string} "{"code": 200, "data": {"1":"管理员","2":"配送员"}}"
// @Router /api/post/names [get]
// @Security Bearer
func (e SysPostController) GetPostNames(c *gin.Context) {
	s := service.SysPost{}
	err := e.MakeContext(c).
		MakeOrm().
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}

	idsStr := c.Query("ids")
	if idsStr == "" {
		e.OK(map[int]string{}, "查询成功")
		return
	}

	// 解析逗号分隔的ID列表
	idStrs := strings.Split(idsStr, ",")
	ids := make([]int, 0, len(idStrs))
	for _, s := range idStrs {
		id := 0
		fmt.Sscanf(strings.TrimSpace(s), "%d", &id)
		if id > 0 {
			ids = append(ids, id)
		}
	}

	result, err := s.GetPostNamesByIds(ids)
	if err != nil {
		e.Error(500, err, err.Error())
		return
	}
	e.OK(result, "查询成功")
}
