package erms3

import (
	"mtp2_if/global/app"
	"mtp2_if/global/e"
	"mtp2_if/logger"
	"mtp2_if/models"
	"net/http"
	"sort"
	"time"

	"github.com/gin-gonic/gin"
)

// customer.go 客户管理

// AddUserInfoApplyReq 新增客户申请请求参数
type AddUserInfoApplyReq struct {
	models.Wskhuserinfo
}

// AddUserInfoApply 新增客户申请
// @Summary 新增客户申请
// @Produce json
// @Security ApiKeyAuth
// @Param jsonBody body AddUserInfoApplyReq true "用户信息"
// @Success 200 {object} app.Response
// @Failure 500 {object} app.Response
// @Router /Erms3/AddUserInfoApply [post]
// @Tags 风险管理v3
func AddUserInfoApply(c *gin.Context) {
	appG := app.Gin{C: c}

	// 获取请求参数
	var req AddUserInfoApplyReq
	err := appG.C.ShouldBindJSON(&req)
	if err != nil {
		logger.GetLogger().Errorf("AddUserInfoApply failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}

	// 设置值
	req.Isvalidate = "1" // 是否有效 (删除后标记为失效) - 0:无效  1:有效
	req.Usertype = 6     // 用户类型 - 1:投资者 2:机构
	if err := models.InsertWSKHUserInfo(req.Wskhuserinfo); err != nil {
		// 执行失败
		logger.GetLogger().Errorf("AddUserInfoApply failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_OPERATION_FAILED, nil)
		return
	}

	// 执行成功
	logger.GetLogger().Debugln("AddUserInfoApply successed: %v", "OK")
	appG.Response(http.StatusOK, e.SUCCESS, "OK")
}

// ModifyUserInfoApplyReq 修改客户申请请求参数
type ModifyUserInfoApplyReq struct {
	models.Wskhuserinfo
}

// ModifyUserInfoApply 修改客户申请
// @Summary 修改客户申请
// @description 保存草稿（撤回）- { "userid": int, "userstate": 1 }  提交审核 - { "userid": int, "userstate": 2 }
// @Produce json
// @Security ApiKeyAuth
// @Param jsonBody body ModifyUserInfoApplyReq true "用户信息"
// @Success 200 {object} app.Response
// @Failure 500 {object} app.Response
// @Router /Erms3/ModifyUserInfoApply [post]
// @Tags 风险管理v3
func ModifyUserInfoApply(c *gin.Context) {
	appG := app.Gin{C: c}

	// 获取请求参数
	var req ModifyUserInfoApplyReq
	err := appG.C.ShouldBindJSON(&req)
	if err != nil {
		logger.GetLogger().Errorf("ModifyUserInfoApply failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}

	if err := models.UpdateWSKHUserInfo(req.Wskhuserinfo); err != nil {
		// 执行失败
		logger.GetLogger().Errorf("ModifyUserInfoApply failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_OPERATION_FAILED, nil)
		return
	}

	// 执行成功
	logger.GetLogger().Debugln("ModifyUserInfoApply successed: %v", "OK")
	appG.Response(http.StatusOK, e.SUCCESS, "OK")
}

// DeleteUserInfoApplyReq 删除客户申请请求参数
type DeleteUserInfoApplyReq struct {
	UserID int `form:"userID" binding:"required"`
}

// DeleteUserInfoApply 删除客户申请
// @Summary 删除客户申请
// @description 只可删除 UserState = 1 （未提交）状态的申请信息
// @Produce json
// @Security ApiKeyAuth
// @Param userID query int true "用户ID"
// @Success 200 {object} app.Response
// @Failure 500 {object} app.Response
// @Router /Erms3/DeleteUserInfoApply [get]
// @Tags 风险管理v3
func DeleteUserInfoApply(c *gin.Context) {
	appG := app.Gin{C: c}

	// 获取请求参数
	var req DeleteUserInfoApplyReq
	err := appG.C.ShouldBindQuery(&req)
	if err != nil {
		logger.GetLogger().Errorf("DeleteUserInfoApply failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}

	if err := models.DeleteWSKHUserInfo(req.UserID); err != nil {
		// 执行失败
		logger.GetLogger().Errorf("DeleteUserInfoApply failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_OPERATION_FAILED, nil)
		return
	}

	// 执行成功
	logger.GetLogger().Debugln("DeleteUserInfoApply successed: %v", "OK")
	appG.Response(http.StatusOK, e.SUCCESS, "OK")
}

// QueryUserInfoAppliesReq 客户申请信息查询请求参数
type QueryUserInfoAppliesReq struct {
	app.PageInfo
	UserName string `form:"userName"`
}

// QueryUserInfoAppliesRsp 客户申请信息查询返回模型
type QueryUserInfoAppliesRsp struct {
	Userid       int64     `json:"userid"  xorm:"'USERID'" binding:"required"` // 用户ID(自增ID)
	Username     string    `json:"username"  xorm:"'USERNAME'"`                // 用户姓名
	Userinfotype int32     `json:"userinfotype"  xorm:"'USERINFOTYPE'"`        // 用户信息类型 - 1:个人  2:企业
	Biznature    int32     `json:"biznature"  xorm:"'BIZNATURE'"`              // 企业性质( 企业) - 1:国有控股企业 2:集体控股企业 3:私人控股企业 4:港澳台商控股企业 5:外商控股企业 6:其它
	Contactname  string    `json:"contactname"  xorm:"'CONTACTNAME'"`          // 联系人
	Userstate    int32     `json:"userstate"  xorm:"'USERSTATE'"`              // 开户状态 -   1:未提交 2: 待初审 3:初审拒绝 4:待复审 5:复审拒绝 6:测评不通过
	Createtime   time.Time `json:"createtime"  xorm:"'CREATETIME'"`            // 开户申请时间
}

// QueryUserInfoApplies 客户申请信息查询
// @Summary 客户申请信息查询
// @Produce json
// @Security ApiKeyAuth
// @Param page query int false "页码"
// @Param pagesize query int false "每页条数"
// @Param userName query string false "客户名称，支持模糊查询"
// @Success 200 {object} QueryUserInfoAppliesRsp
// @Failure 500 {object} app.Response
// @Router /Erms3/QueryUserInfoApplies [get]
// @Tags 风险管理v3
func QueryUserInfoApplies(c *gin.Context) {
	appG := app.Gin{C: c}

	// 获取请求参数
	var req QueryUserInfoAppliesReq
	err := appG.C.ShouldBindQuery(&req)
	if err != nil {
		logger.GetLogger().Errorf("QueryUserInfoApplies failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}

	// 获取客户信息
	userInfos, err := models.GetWSKHUserInfos(req.UserName)
	if err != nil {
		// 查询失败
		logger.GetLogger().Errorf("QueryUserInfoApplies failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}

	// 排序
	sort.Slice(userInfos, func(i int, j int) bool {
		return userInfos[i].Createtime.After(userInfos[j].Createtime)
	})

	// 分页
	total := len(userInfos)
	if req.PageSize > 0 {
		rstByPage := make([]models.Wskhuserinfo, 0)
		// 开始上标
		start := req.Page * req.PageSize
		// 结束下标
		end := start + req.PageSize

		if start <= len(userInfos) {
			// 判断结束下标是否越界
			if end > len(userInfos) {
				end = len(userInfos)
			}
			rstByPage = userInfos[start:end]
		} else {
			rstByPage = userInfos[0:0]
		}

		userInfos = rstByPage
	}

	// 转换返回模型
	rsp := make([]QueryUserInfoAppliesRsp, 0)
	for _, v := range userInfos {
		rsp = append(rsp, QueryUserInfoAppliesRsp{
			Userid:       v.Userid,
			Username:     v.Username,
			Userinfotype: v.Userinfotype,
			Biznature:    v.Biznature,
			Contactname:  v.Contactname,
			Userstate:    v.Userstate,
			Createtime:   v.Createtime,
		})
	}

	// 查询成功返回
	if req.PageSize > 0 {
		logger.GetLogger().Debugln("QueryUserInfoApplies successed: %v", rsp)
		appG.ResponseByPage(http.StatusOK, e.SUCCESS, rsp, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: total})
	} else {
		logger.GetLogger().Debugln("QueryUserInfoApplies successed: %v", rsp)
		appG.Response(http.StatusOK, e.SUCCESS, rsp)
	}
}

// QueryUserInfosReq 客户信息查询请求参数
type QueryUserInfosReq struct {
	app.PageInfo
	UserName string `form:"userName"`
}

// QueryUserInfosRsp 客户信息查询返回模型
type QueryUserInfosRsp struct {
	Userid       int64  `json:"userid"  xorm:"'USERID'" binding:"required"` // 用户ID
	Userinfotype int32  `json:"userinfotype"  xorm:"'USERINFOTYPE'"`        // 用户信息类型 - 1:个人  2:企业
	Customername string `json:"customername"  xorm:"'CUSTOMERNAME'"`        // 客户名称(企业名称)
	Userstatus   int32  `json:"userstatus"  xorm:"'USERSTATUS'"`            // 用户状态 - 1：正常 2：注销
	Biznature    int32  `json:"biznature"  xorm:"'BIZNATURE'"`              // 企业性质( 企业) - 1:国有控股企业 2:集体控股企业 3:私人控股企业 4:港澳台商控股企业 5:外商控股企业 6:其它
	Contactname  string `json:"contactname"  xorm:"'CONTACTNAME'"`          // 联系人
}

// QueryUserInfos 客户信息查询
// @Summary 客户信息查询
// @Produce json
// @Security ApiKeyAuth
// @Param page query int false "页码"
// @Param pagesize query int false "每页条数"
// @Param userName query string false "客户名称，支持模糊查询"
// @Success 200 {object} QueryUserInfosRsp
// @Failure 500 {object} app.Response
// @Router /Erms3/QueryUserInfos [get]
// @Tags 风险管理v3
func QueryUserInfos(c *gin.Context) {
	appG := app.Gin{C: c}

	// 获取请求参数
	var req QueryUserInfosReq
	err := appG.C.ShouldBindQuery(&req)
	if err != nil {
		logger.GetLogger().Errorf("QueryUserInfos failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}

	// 获取客户信息
	userInfos, err := models.GetUserInfos(req.UserName)
	if err != nil {
		// 查询失败
		logger.GetLogger().Errorf("QueryUserInfos failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}

	// 排序
	sort.Slice(userInfos, func(i int, j int) bool {
		return userInfos[i].Createtime.After(userInfos[j].Createtime)
	})

	// 分页
	total := len(userInfos)
	if req.PageSize > 0 {
		rstByPage := make([]models.Userinfo, 0)
		// 开始上标
		start := req.Page * req.PageSize
		// 结束下标
		end := start + req.PageSize

		if start <= len(userInfos) {
			// 判断结束下标是否越界
			if end > len(userInfos) {
				end = len(userInfos)
			}
			rstByPage = userInfos[start:end]
		} else {
			rstByPage = userInfos[0:0]
		}

		userInfos = rstByPage
	}

	// 转换返回模型
	rsp := make([]QueryUserInfosRsp, 0)
	for _, v := range userInfos {
		rsp = append(rsp, QueryUserInfosRsp{
			Userid:       v.Userid,
			Userinfotype: v.Userinfotype,
			Customername: v.Customername,
			Userstatus:   v.Userstatus,
			Biznature:    v.Biznature,
			Contactname:  v.Contactname,
		})
	}

	// 查询成功返回
	if req.PageSize > 0 {
		logger.GetLogger().Debugln("QueryUserInfos successed: %v", rsp)
		appG.ResponseByPage(http.StatusOK, e.SUCCESS, rsp, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: total})
	} else {
		logger.GetLogger().Debugln("QueryUserInfos successed: %v", rsp)
		appG.Response(http.StatusOK, e.SUCCESS, rsp)
	}
}
