package admin

import (
	"github.com/druidcaesa/gotool"
	"strconv"
	"ulink-admin/frame"
	"ulink-admin/modules/system/models/model"
	"ulink-admin/modules/system/models/req"
	"ulink-admin/modules/system/models/response"
	service2 "ulink-admin/modules/system/service"
	"ulink-admin/pkg/excels"
	"ulink-admin/pkg/jwt/admin"
	"ulink-admin/pkg/page"
)

// UserApi 用户操作api
type UserApi struct {
	UserService *service2.UserService `inject:""`
	RoleService *service2.RoleService `inject:""`
}

// Find @Summary 用户列表查询接口
// @Description 用户列表查询接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param object query req.UserQuery false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=page.Page{list=model.SysUser},msg=string} "分页获取用户列表,返回包括列表,总数,页码,每页数量"
// @Router /user/page [get]
func (a UserApi) Find(c *frame.Context) {
	query := &req.UserQuery{}
	c.ValidteError(c.ShouldBind(query), query)
	list, i := a.UserService.Page(query)
	c.Ok(page.Page{
		Size:  query.PageSize,
		Total: i,
		List:  list,
	})

}

// Find @Summary 用户列表查询接口
// @Description 用户列表查询接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param object query req.UserQuery false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=page.Page{list=model.SysUser},msg=string} "分页获取用户列表,返回包括列表,总数,页码,每页数量"
// @Router /user/list [get]
func (a UserApi) List(c *frame.Context) {
	query := &req.UserQuery{}
	c.ValidteError(c.ShouldBind(query), query)
	list := make([]model.SysUser, 0)
	a.UserService.List(query, &list)
	c.Ok(list)

}

// GetInfo @Summary 用户详情查询接口
// @Description 用户详情查询接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param id path   int true "id" id
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=response.UserInfo,msg=string} "返回用户详情查询"
// @Router /user/getInfo [get]
func (a UserApi) GetInfo(c *frame.Context) {
	param := c.Param("id")
	r := new(response.UserInfo)
	roleAll := make([]model.SysRole, 0)
	//查询角色
	a.RoleService.List(&req.RoleQuery{}, &roleAll)
	//判断id传入的是否为空
	if !gotool.StrUtils.HasEmpty(param) {
		parseInt, err := strconv.ParseInt(param, 10, 64)
		if err == nil {
			//判断当前登录用户是否是admin
			m := new(model.SysUser)
			if m.IsAdmin(parseInt) {
				r.Roles = roleAll
			} else {
				roles := make([]model.SysRole, 0)
				for _, role := range roleAll {
					if role.Id != 1 {
						roles = append(roles, role)
					}
				}
				r.Roles = roles
			}
			user := new(model.SysUser)
			a.UserService.GetById(parseInt, user)
			if user == nil {
				frame.Throw(frame.BUSINESS_CODE, "用户查询异常")
			}
			role := a.RoleService.SelectRoleListByUserId(parseInt)
			if role == nil {
				frame.Throw(frame.BUSINESS_CODE, "角色查询异常")
			}
			//根据id获取用户数据
			r.User = user
			//根据用户ID查询角色id集合
			r.RoleIds = role
		}
	} else {
		//id为空不取管理员角色
		roles := make([]model.SysRole, 0)
		for _, role := range roleAll {
			if role.Id != 1 {
				roles = append(roles, role)
			}
		}
		r.Roles = roles
	}
	c.Ok(r)
}

// MyInfo @Summary 会员详情查询接口
// @Description 会员详情等查询接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=response.MemberInfo,msg=string} "返回会员详情查询"
// @Router /app/user/myInfo [get]
func (a UserApi) MyInfo(c *frame.Context) {
	userId := admin.GetUserInfo(c).Id
	memberInfo := new(response.MemberInfo)
	user := new(model.SysUser)
	a.UserService.GetById(userId, user)
	//查询会员信息
	memberInfo.User = user

	if memberInfo.User == nil {
		c.Error("用户查询异常")
		return
	}
	c.Ok(memberInfo)
}

// AuthRole 根据用户编号获取授权角色
func (a UserApi) AuthRole(c *frame.Context) {
	/*	m := make(map[string]interface{})
		id := c.Param("id")
		parseInt, err := strconv.ParseInt(id, 10, 64)
		if err != nil {
			gotool.Logs.ErrorLog().Println(err)
			c.JSON(500, resp.ErrorResp(err))
		}
		user := a.UserService.GetUserById(parseInt)
		if user == nil {
			resp.Error(c, "用户查询异常")
			return
		}
		//查询角色
		roles := a.RoleService.GetRoleListByUserId(parseInt)
		if roles == nil {
			resp.Error(c, "角色查询异常")
			return
		}

		flag := model.SysUser{}.IsAdmin(parseInt)
		if flag {
			m["roles"] = roles
		} else {
			roleList := make([]model.SysRole, 0)
			for _, role := range *roles {
				if role.Id != 1 {
					roleList = append(roleList, role)
				}
			}
			m["roles"] = roleList
		}
		allRoles := a.RoleService.FindAll()
		if allRoles == nil {
			resp.Error(c, "角色查询异常")
			return
		}
		if flag {
			m["allRoles"] = allRoles
		} else {
			roleList := make([]model.SysRole, 0)
			for _, role := range allRoles {
				if role.Id != 1 {
					roleList = append(roleList, *role)
				}
			}
			m["allRoles"] = roleList
		}

		m["user"] = user
		c.JSON(200, resp.Success(m))*/
}

// Add @Summary 新增用户接口
// @Description 新增用户接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param  data body model.SysUser true "用户实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/add [post]
func (a UserApi) Add(c *frame.Context) {
	userBody := &req.UserBody{}
	c.ValidteError(c.ShouldBind(userBody), userBody)
	userBody.DelFlag = "0"
	userBody.Balance = "0.00"
	//添加用户
	a.UserService.Insert(userBody)
}

// Edit @Summary 修改用户接口
// @Description 修改用户接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param  data body model.SysUser true "用户实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/edit [put]
func (a UserApi) Edit(c *frame.Context) {
	userBody := &req.UserBody{}
	c.ValidteError(c.ShouldBind(userBody), userBody)
	//进行用户修改操作
	a.UserService.Edit(userBody)
}

// Remove @Summary 删除用户接口
// @Description 删除用户接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param id path   int true "id" id
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/remove [delete]
func (a UserApi) Remove(c *frame.Context) {
	param := c.Param("id")
	id, err := strconv.ParseInt(param, 10, 64)
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
		c.Error("参数错误")
		return
	}
	a.UserService.Remove(id)
}

// ResetPwd @Summary 重置用户密码接口
// @Description 重置用户密码接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param  data body model.SysUser true "用户实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/resetPwd [put]
func (a UserApi) ResetPwd(c *frame.Context) {
	userBody := &req.UserBody{}
	c.ValidteError(c.ShouldBind(userBody), userBody)
	if a.UserService.CheckUserAllowed(userBody) {
		c.Error("不允许操作超级管理员用户")
		return
	}
	userBody.Password = gotool.BcryptUtils.Generate(userBody.Password)
	//进行密码修改
	a.UserService.ResetPwd(userBody)
}

// Export 导出excel
func (a UserApi) Export(c *frame.Context) {
	query := &req.UserQuery{}
	c.ValidteError(c.ShouldBind(query), query)

	items := make([]interface{}, 0)
	list, _ := a.UserService.Page(query)
	for _, userResponse := range list {
		items = append(items, *userResponse)
	}
	_, file := excels.ExportExcel(items, "用户表")
	c.Header("Content-Type", "application/octet-stream")
	c.Header("Content-Disposition", "attachment; filename="+gotool.IdUtils.IdUUIDToRan(false)+".xlsx")
	c.Header("Content-Transfer-Encoding", "binary")
	c.Header("FileName", gotool.IdUtils.IdUUIDToRan(false)+".xlsx")
	_ = file.Write(c.Writer)
}

// Profile 查询个人信息
// @Summary 查询个人信息接口
// @Description 查询个人信息接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param id path   int true "id" id
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=map[string]interface{},msg=string} "返回个人详情查询"
// @Router /user/profile [get]
func (a UserApi) Profile(c *frame.Context) {
	m := make(map[string]interface{})
	info := admin.GetUserInfo(c)
	user := new(model.SysUser)
	a.UserService.GetById(info.Id, user)
	m["user"] = user
	// 查询所属角色组
	m["roleGroup"] = a.RoleService.SelectRolesByUserName(info.UserName)
	c.Ok(m)
}

// UpdateProfile 修改个人数据
// @Summary 修改个人数据接口
// @Description 修改个人数据接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param  data body model.SysUser true "用户实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/profile [put]
func (a UserApi) UpdateProfile(c *frame.Context) {
	user := &req.UserBody{}
	c.ValidteError(c.ShouldBind(user), user)
	a.UserService.EditProfile(user)
}

// ChangeAuthRole 修改状态
// @Summary 修改状态接口
// @Description 修改状态接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param id query   int true "id" id
// @Param status query   string true "status" status
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/authRole [put]
func (a UserApi) ChangeAuthRole(c *frame.Context) {
	userBody := &req.UserBody{}
	c.ValidteError(c.ShouldBind(userBody), userBody)
	a.UserService.UpdateAuthRole(userBody)
}

// ChangeStatus 修改状态
// @Summary 修改状态接口
// @Description 修改状态接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param id query   int true "id" id
// @Param status query   string true "status" status
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/changeStatus [put]
func (a UserApi) ChangeStatus(c *frame.Context) {
	param := c.Query("id")
	status := c.Query("status")
	id, err := strconv.ParseInt(param, 10, 64)
	if err != nil {
		c.Error("参数错误")
		return
	}
	a.UserService.UpdateStatus(id, status)
}

// UpdatePwd 修改个人密码
// @Summary 修改个人密码接口
// @Description 修改个人密码接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param oldPassword query   string true "oldPassword" oldPassword
// @Param newPassword query   string true "newPassword" newPassword
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/profile/updatePwd [put]
func (a UserApi) UpdatePwd(c *frame.Context) {
	oldPassword := c.Query("oldPassword")
	newPassword := c.Query("newPassword")
	info := admin.GetUserInfo(c)
	name := a.UserService.GetUserByUserName(info.UserName)
	hash := gotool.BcryptUtils.CompareHash(name.Password, oldPassword)
	if !hash {
		c.Error("修改密码失败,旧密码错误")
		return
	}
	generate := gotool.BcryptUtils.Generate(oldPassword)
	compareHash := gotool.BcryptUtils.CompareHash(generate, newPassword)
	if compareHash {
		c.Error("新密码不能与旧密码相同")
		return
	}
	a.UserService.UpdatePwd(info.Id, gotool.BcryptUtils.Generate(newPassword))

}

// Avatar 修改头像
// UpdatePwd 修改个人密码
// @Summary 修改个人密码接口
// @Description 修改个人密码接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用户令牌"
// @Param file formData file true "avatarfile"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /user/profile/avatar [put]
func (a UserApi) Avatar(c *frame.Context) {
	img := c.Request.FormValue("img")
	// 进行存储
	info := admin.GetUserInfo(c)
	info.Avatar = img
	a.UserService.UpdateAvatar(info)
}