/*
 * @description: session判断中间件
 * @Author: CP
 * @Date: 2020-08-28 14:17:23
 * @FilePath: \construction_management\web\middleware\sessions.go
 */
package middleware

import (
	"errors"
	"net/url"
	"strconv"

	"github.com/kataras/iris/v12"
	"go.mod/comm"
	"go.mod/conf"
	"go.mod/services"
)

func SessionsAuth(ctx iris.Context) {
	// 获得cookie
	cookie, err := ctx.Request().Cookie("cm")
	if err != nil {
		ctx.JSON(iris.Map{"code": 1, "msg": "请重新登陆"})
		return
	}
	// 格式化
	params, err := url.ParseQuery(cookie.Value)
	if err != nil {
		ctx.JSON(iris.Map{"code": 1, "msg": "请重新登陆"})
		return
	}

	// 获得用户信息--TODO 存放redis
	// 解密用户标识
	identityId, err := getDecryptId(params.Get("identity"))
	if err != nil {
		ctx.JSON(iris.Map{"code": 1, "msg": "账号发生异常1"})
		return
	}
	// 数字证书
	digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(identityId))

	// 解密副标识
	attachedIdentityId, err := getDecryptId(params.Get("attachedIdentity"))
	if err != nil {
		ctx.JSON(iris.Map{"code": 1, "msg": "账号发生异常2"})
		return
	}
	npaSer := services.NewProjectAccountService()
	accountInfo := npaSer.Get(identityId, attachedIdentityId)
	if accountInfo.Id == "0" {
		ctx.JSON(iris.Map{"code": 1, "msg": "账号不存在"})
		return
	}

	ctx.Values().Set("accountId", identityId)
	ctx.Values().Set("projectId", attachedIdentityId)
	ctx.Values().Set("account", accountInfo)
	// 设置viewData
	//ctx.ViewData("Account", accountInfo)

	// 比对数字证书
	if digitalToken != params.Get("digitalToken") {
		ctx.JSON(iris.Map{"code": 1, "msg": "账号异常3"})
		return
	}
	// TODO 分布式session

	//通过后执行下一步
	ctx.Next()
}

// 获得解密后的ID
func getDecryptId(id string) (int, error) {
	id, err := comm.AesDecrypt(id, conf.CookieSecret)
	if err != nil {
		return 0, errors.New("ID 解析错误")
	}
	idInt, err := strconv.Atoi(id)
	if err != nil {
		return 0, errors.New("ID 转换错误")
	}
	return idInt, nil
}

// 登陆态-认证
// func SessionsAuth(ctx iris.Context) {
// 	// 获得cookie
// 	cookie, err := ctx.Request().Cookie("cm")
// 	if err != nil {
// 		comm.Redirect(ctx.ResponseWriter(), "/login")
// 	}
// 	// 格式化
// 	params, err := url.ParseQuery(cookie.Value)
// 	if err != nil {
// 		comm.Redirect(ctx.ResponseWriter(), "/login")
// 	}

// 	// 解密用户标识
// 	identity, err := comm.AesDecrypt(params.Get("identity"), conf.CookieSecret)
// 	if err != nil {
// 		comm.Redirect(ctx.ResponseWriter(), "/login")
// 	}
// 	digitalToken := comm.CreateSign(conf.CookieSecret + identity)

// 	// 获得用户信息--TODO 存放redis
// 	npaSer := services.NewProjectAccountService()
// 	identityId, err := strconv.Atoi(identity)
// 	if err != nil {
// 		comm.Redirect(ctx.ResponseWriter(), "/login")
// 	}
// 	// TODO 项目ID的获得
// 	accountInfo := npaSer.Get(identityId, 2)
// 	if accountInfo.Id == "0" {
// 		comm.Redirect(ctx.ResponseWriter(), "/login")
// 	}
// 	ctx.Values().Set("accountId", identity)
// 	projectId, err := comm.AesDecrypt(accountInfo.ProjectId, conf.SignSecret)
// 	if err != nil {
// 		comm.Redirect(ctx.ResponseWriter(), "/login")
// 	}
// 	ctx.Values().Set("projectId", projectId)
// 	// 设置viewData
// 	ctx.ViewData("Account", accountInfo)
// 	// npaDao := dao.NewProjectAccountDao(datasource.InstanceDbMaster())
// 	// identityId, err := strconv.Atoi(identity)
// 	// if err != nil {
// 	// 	comm.Redirect(ctx.ResponseWriter(), "/login")
// 	// }
// 	// accountInfo := npaDao.Get(identityId)
// 	// if accountInfo.Id == 0 {
// 	// 	comm.Redirect(ctx.ResponseWriter(), "/login")
// 	// }
// 	// ctx.Values().Set("accountId", identity)

// 	// 设置viewData
// 	// accountView := viewmodels.ProjectAccount{}
// 	// accountView.Account = accountInfo.Account
// 	// accountView.Name = accountInfo.Name
// 	// accountView.Company = accountInfo.Company
// 	// accountView.Role = accountInfo.Role
// 	// accountView.Mobile = accountInfo.Mobile
// 	// accountView.Telephone = accountInfo.Telephone
// 	// ctx.ViewData("Account", accountView)

// 	// 比对数字证书
// 	if digitalToken != params.Get("digitalToken") {
// 		comm.Redirect(ctx.ResponseWriter(), "/login")
// 	}
// 	// TODO 分布式session

// 	//通过后执行下一步
// 	ctx.Next()
// }
