package eta_trial

import (
	"encoding/json"
	"eta/eta_forum_hub/controllers"
	"eta/eta_forum_hub/models"
	"eta/eta_forum_hub/models/eta_trial"
	eta_trial2 "eta/eta_forum_hub/services/eta_trial"
	"eta/eta_forum_hub/utils"
	"time"
)

type EtaTrialController struct {
	controllers.BaseAuthController
}

// GetUserByMobile
// @Title 手机号获取用户信息
// @Description 手机号获取用户信息
// @Success 200 {string} string "操作成功"
// @router /user/mobile_fetch [post]
func (this *EtaTrialController) GetUserByMobile() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.GetUserReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.Mobile == "" {
		br.Msg = "请输入手机号"
		return
	}

	item, e := models.GetEtaTrialByMobile(req.Mobile)
	if e != nil && e.Error() != utils.ErrNoRow() {
		br.Msg = "操作失败"
		br.ErrMsg = "获取试用客户信息失败, Err:" + e.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = item
}

// Disable
// @Description 禁用
// @Success 200 {string} string "操作成功"
// @router /user/disable [post]
func (this *EtaTrialController) Disable() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.GetUserReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.Mobile == "" {
		br.Msg = "请输入手机号"
		return
	}

	if e := models.DisableEtaTrailByMobile(req.Mobile); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "禁用试用客户失败, Err:" + e.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// Edit
// @Description 编辑
// @Success 200 {string} string "操作成功"
// @router /user/edit [post]
func (this *EtaTrialController) Edit() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.UserEditReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if e := models.UpdateEtaTrialPositionByMobile(req.RealName, req.Position, req.Mobile, req.Enabled); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "更新试用客户失败, Err:" + e.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// Remove
// @Description 删除用户
// @Success 200 {string} string "操作成功"
// @router /user/remove [post]
func (this *EtaTrialController) Remove() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.GetUserReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.Mobile == "" {
		br.Msg = "请输入手机号"
		return
	}

	if e := models.DeleteEtaTrialByMobile(req.Mobile); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "删除试用客户失败, Err:" + e.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// UpdateLogin
// @Title 更新登录时间和次数
// @Description 更新登录时间和次数
// @Param	request	body eta_trial.UpdateUserLoginReq true "type json string"
// @Success 200 "操作成功"
// @router /user/update_login [post]
func (this *EtaTrialController) UpdateLogin() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.UpdateUserLoginReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.Mobile == "" {
		br.Msg = "请输入手机号"
		return
	}

	if e := models.UpdateEtaTrialLoginByMobile(req.Mobile); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "更新试用客户登录时间和次数失败, Err:" + e.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// UpdateIndexNum
// @Description 更新累计新增指标数
// @Success 200 {string} string "操作成功"
// @router /user/update_index_num [post]
func (this *EtaTrialController) UpdateIndexNum() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.UpdateUserIndexNumReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.Mobile == "" {
		br.Msg = "请输入手机号"
		return
	}

	if e := models.UpdateEtaTrialIndexNumByMobile(req.Mobile); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "更新试用客户累计新增指标数失败, Err:" + e.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// UpdateChartNum
// @Description 更新累计新增图表数
// @Success 200 {string} string "操作成功"
// @router /user/update_chart_num [post]
func (this *EtaTrialController) UpdateChartNum() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.UpdateUserIndexNumReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.Mobile == "" {
		br.Msg = "请输入手机号"
		return
	}

	if e := models.UpdateEtaTrialChartNumByMobile(req.Mobile); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "更新试用客户累计新增图表数失败, Err:" + e.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// UpdateActiveTime
// @Description 更新活跃时间
// @Success 200 {string} string "操作成功"
// @router /user/update_active_time [post]
func (this *EtaTrialController) UpdateActiveTime() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.UpdateUserActiveTimeReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	record := new(models.EtaTrialActiveRecord)
	record.UserName = req.UserName
	record.Mobile = req.Mobile
	record.ActiveTime = req.ActiveTime
	record.Part = req.Part
	record.CreateTime = time.Now().Local()
	if e := record.Create(); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "新增试用客户活跃记录失败, Err:" + e.Error()
		return
	}
	if e := models.UpdateEtaTrailActiveTime(req.ActiveTime, req.Mobile); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "更新试用客户累计活跃时长失败, Err:" + e.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// UpdateLoginDuration
// @Description 更新登录时长
// @Success 200 {string} string "操作成功"
// @router /user/update_login_duration [post]
func (this *EtaTrialController) UpdateLoginDuration() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.UpdateUserLoginDurationReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	record := new(models.EtaTrialLoginDurationRecord)
	record.UserName = req.UserName
	record.Mobile = req.Mobile
	record.Duration = req.ActiveTime
	record.CreateTime = time.Now().Local()
	if e := record.Create(); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "新增试用客户登录时长记录失败, Err:" + e.Error()
		return
	}
	if e := models.UpdateEtaTrailLastLoginDuration(req.ActiveTime, req.Mobile); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "更新试用客户登录时长失败, Err:" + e.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = true
}

// AddEtaTrialAdmin
// @Title 新增或者编辑系统用户
// @Description 新增系统用户接口
// @Param	request	body system.SysuserAddReq true "type json string"
// @Success 200 新增成功
// @router /admin/add [post]
func (this *EtaTrialController) AddEtaTrialAdmin() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.AddEtaTrialAdminReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	//新增至试用平台的Admin

	adminItem, err := eta_trial.GetSysUserByRoleAndDepartment("试用", "ETA试用客户")
	if err != nil {
		br.Msg = "获取用户信息失败"
		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
		return
	}

	admin := new(eta_trial.ETATrialAdmin)
	admin.AdminName = req.Account
	admin.RealName = req.UserName
	admin.Password = utils.MD5(req.Password)
	admin.LastUpdatedPasswordTime = time.Now().Format(utils.FormatDateTime)
	admin.Enabled = 1
	admin.LastLoginTime = time.Now().Format(utils.FormatDateTime)
	admin.CreatedTime = time.Now()
	admin.LastUpdatedTime = time.Now().Format(utils.FormatDateTime)
	admin.Mobile = req.Mobile
	admin.RoleType = 0

	admin.RoleId = adminItem.RoleId
	admin.RoleName = "试用"
	admin.RoleTypeCode = "管理员"
	admin.DepartmentId = adminItem.DepartmentId
	admin.DepartmentName = "ETA试用客户"
	admin.Role = "admin"
	admin.Position = req.Position

	newId, err := eta_trial.AddAdmin(admin)
	if err != nil {
		br.Msg = "新增失败"
		br.ErrMsg = "新增失败,AddAdmin Err:" + err.Error()
		return
	}

	// 新增试用客户手工权限
	go func() {
		//_ = services.CreateTrialUserManualAuth(newId, admin.RealName)
		_ = eta_trial2.EtaTrialManualUserAddAuth(newId, admin.RealName)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "新增成功"
}

// EnabledEtaTrialAdmin
// @Title 新增或者编辑系统用户
// @Description 新增系统用户接口
// @Param	request	body system.SysuserAddReq true "type json string"
// @Success 200 新增成功
// @router /admin/enabled [post]
func (this *EtaTrialController) EnabledEtaTrialAdmin() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.EnabledEtaTrialAdminReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	//新增至试用平台的Admin
	if req.Mobile == "" {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:手机号不能为空"
		return
	}
	err = eta_trial.UpdateAdminEnable(req.Mobile)
	if err != nil {
		br.Msg = "启用失败"
		br.ErrMsg = "启用失败,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}

// GetMobileCount
// @Title 新增或者编辑系统用户
// @Description 新增系统用户接口
// @Param	request	body system.SysuserAddReq true "type json string"
// @Success 200 新增成功
// @router /mobile/count [post]
func (this *EtaTrialController) GetMobileCount() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req eta_trial.GetMobileCountReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	//新增至试用平台的Admin
	if req.Mobile == "" {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:手机号不能为空"
		return
	}
	mobileCount, err := eta_trial.GetSysAdminCountByMobile(req.Mobile, 0)
	if err != nil {
		br.Msg = "启用失败"
		br.ErrMsg = "启用失败,Err:" + err.Error()
		return
	}
	data := new(eta_trial.GetMobileCountResp)
	data.Count = mobileCount
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = data
}

// AutoDisableAdmin
// @Title 自动禁用14天的试用客户
// @Description 自动禁用14天的试用客户
// @Success 200 操作成功
// @router /admin/auto_disable [post]
func (this *EtaTrialController) AutoDisableAdmin() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	err := eta_trial2.ETATrialAutoDisabled()
	if err != nil {
		br.Msg = "启用失败"
		br.ErrMsg = "启用失败,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	return
}