/*
 * @description: 项目账号相关
 * @Author: CP
 * @Date: 2020-09-25 14:42:31
 * @FilePath: \construction_management\web\api\project_account_api.go
 */
package api

import (
	"fmt"

	"github.com/kataras/iris/v12"
	"go.mod/services"
	"go.mod/web/utils"
	"go.mod/web/viewmodels"
)

type ProjectAccountApi struct {
	//框架-web应用上下文环境
	Ctx iris.Context
	// 需要用的service
	ServiceProjectAccount services.ProjectAccountService
}

// @Summary 获得登陆账号信息相关
// @Tags 项目账号相关
// @Description 获得登陆账号相关信息
// @Security ApiKeyAuth
// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
// @Router /api/projectAccount [get]
func (c *ProjectAccountApi) Get() {

	// 获得项目账号ID
	projectAccountIdInt, err := utils.GetProjectAccountId(c.Ctx)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
		return
	}

	// 获得项目ID
	projectIdInt, err := utils.GetProjectId(c.Ctx)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 获得登陆用户
	AccountData := c.ServiceProjectAccount.Get(projectAccountIdInt, projectIdInt)

	c.Ctx.JSON(iris.Map{
		"code": 0,
		"msg":  "",
		"data": AccountData,
	})
}

// @Summary 获得项目账号列表
// @Tags 项目账号相关
// @Description 获得项目账号列表
// @Security ApiKeyAuth
// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
// @Router /api/projectAccount/list [get]
func (c *ProjectAccountApi) GetList() {

	// 获得项目ID
	projectIdInt, err := utils.GetProjectId(c.Ctx)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
		return
	}

	AccountData := c.ServiceProjectAccount.GetAll(projectIdInt)
	c.Ctx.JSON(iris.Map{
		"code": 0,
		"msg":  "",
		"data": AccountData,
	})
}

// @Summary 获得项目账号角色列表
// @Tags 项目账号相关
// @Description 获得项目账号角色列表
// @Security ApiKeyAuth
// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
// @Router /api/projectAccount/group [get]
func (c *ProjectAccountApi) GetGroup() {

	// 获得检索关键字
	// AccountData := viewmodels.ProjectAccount{}
	// err := c.Ctx.ReadForm(&AccountData)
	// if err != nil {
	// 	c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("JSON转换异常, error=%s", err)})
	// 	return
	// }

	// 获得项目ID
	// projectId, err := utils.GetProjectId(c.Ctx)
	// if err != nil {
	// 	c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
	// 	return
	// }

	// accountData := c.ServiceProjectAccount.GetAll(projectId)
	// 检索
	// accountData := c.ServiceProjectAccount.Search(AccountData.Name, projectId)

	groupDate := map[int]string{
		1: "建设单位",
		2: "监理单位",
		3: "施工单位",
		4: "设计单位",
	}
	c.Ctx.JSON(iris.Map{
		"code": 0,
		"msg":  "",
		"data": groupDate,
		// "accountData": accountData,
	})
}

// @Summary 检索账号信息
// @Tags 项目账号相关
// @Description 检索字段：账号 姓名 单位 手机 前匹配
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param   name     body    string     true        "检索内容"
// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
// @Router /api/projectAccount/searchc [get]
func (c *ProjectAccountApi) GetSearch() {
	// 获得项目ID
	projectIdInt, err := utils.GetProjectId(c.Ctx)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 获得检索关键字
	AccountData := viewmodels.ProjectAccount{}
	err = c.Ctx.ReadForm(&AccountData)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("JSON转换异常, error=%s", err)})
		return
	}

	// 检索
	dataList := c.ServiceProjectAccount.Search(AccountData.Name, projectIdInt)
	c.Ctx.JSON(iris.Map{
		"code": 0, "msg": "",
		"data": dataList,
	})
}

// @Summary 编辑账号
// @Tags 项目账号相关
// @Description 编辑账号
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param   id     body    string     true        "账号ID" default(PcqqGsn1O0jBSmLqkuOTwQ)
// @Param   name     body    string     true        "姓名"
// @Param   company     body    string     true        "公司"
// @Param   position     body    string     true        "职位"
// @Param   telephone     body    string     true        "座机"
// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
// @Router /api/projectAccount/account/save [post]
func (c *ProjectAccountApi) PostAccountSave() {
	// 验证内容
	AccountData, err := c.ServiceProjectAccount.ValidRuleAccount(c.Ctx)
	if err != nil {
		ErrMsg := utils.FormValidError(err)
		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
		return
	} else {
		// 获得更新账号ID
		id, err := utils.GetDecryptId(AccountData.Id)
		if err != nil {
			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
			return
		}
		projectId, err := utils.GetProjectId(c.Ctx)
		if err != nil {
			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
			return
		}

		err = c.ServiceProjectAccount.SaveAccount(AccountData, id, projectId)
		if err != nil {
			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
			return
		}
		c.Ctx.JSON(iris.Map{"code": 0, "msg": "编辑成功"})
	}
}

// @Summary 修改密码
// @Tags 项目账号相关
// @Description 编辑账号
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param   password     body    string     true        "密码"
// @Param   newPassword     body    string     true        "新密码"
// @Param   confirmPassword     body    string     true        "确认新密码"
// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
// @Router /api/projectAccount/change/password [post]
func (c *ProjectAccountApi) PostChangePassword() {
	// 验证内容
	AccountData, err := c.ServiceProjectAccount.ValidRuleChangePassword(c.Ctx)
	if err != nil {
		ErrMsg := utils.FormValidError(err)
		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
		return
	} else {
		if AccountData.ConfirmPassword != AccountData.NewPassword {
			c.Ctx.JSON(iris.Map{"code": -1, "msg": "新密码和确认密码不一致"})
			return
		}
		// 获得项目ID
		projectId, err := utils.GetProjectId(c.Ctx)
		if err != nil {
			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
			return
		}
		// 获得项目账号ID
		projectAccountId, err := utils.GetProjectAccountId(c.Ctx)
		if err != nil {
			c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
			return
		}
		err = c.ServiceProjectAccount.ChangePassword(AccountData, projectId, projectAccountId)
		if err != nil {
			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
			return
		}
		c.Ctx.JSON(iris.Map{"code": 0, "msg": "更新成功"})
	}
}
