package services

import (
	"fmt"
	"github.com/mozillazg/go-pinyin"
	"hongze/hz_crm_api/models/company"
	"hongze/hz_crm_api/models/eta_trial"
	"hongze/hz_crm_api/services/alarm_msg"
	"hongze/hz_crm_api/utils"
	"strconv"
	"time"
)

// UpdateOldTrialUsersManualAuth 更新原试用客户手工录入权限(一次性)
func UpdateOldTrialUsersManualAuth() (err error) {
	// 从ETA试用平台的edb库中读取手工数据分类
	classifyList, e := eta_trial.GetETATrialManualClassify()
	if e != nil {
		fmt.Println(e.Error())
		return
	}
	classifyIds := make([]int, 0)
	for i := range classifyList {
		classifyIds = append(classifyIds, classifyList[i].ClassifyId)
	}

	// 查询未分配手工权限的试用客户Ids
	userList, e := eta_trial.GetNoAuthTrialUserIds()
	if e != nil {
		fmt.Println(e.Error())
		return
	}
	if len(userList) == 0 {
		fmt.Println("无客户需要更新手工权限")
		return
	}
	fmt.Println("classifyIds", classifyIds)

	// 遍历试用客户, ETA试用平台data库新增manual_user用户关联、manual_user_classify权限关联
	for i := range userList {
		fmt.Printf("用户%d-%s正在更新\n", userList[i].AdminId, userList[i].RealName)
		e = eta_trial.InsertTrialUserManualAuth(userList[i].AdminId, userList[i].RealName, classifyIds)
		if e != nil {
			fmt.Println(e.Error())
			return
		}
		fmt.Println("更新成功")
		//break // 试一个先
	}
	return
}

// CreateTrialUserManualAuth 新增试用客户手工录入权限
// 鉴于DB注册时即使不同库也不能同名的情况, 以下均使用原生SQL
func CreateTrialUserManualAuth(adminId int, adminRealName string) (err error) {
	defer func() {
		if err != nil {
			alarm_msg.SendAlarmMsg(fmt.Sprintf("新增试用客户手工录入权限失败, ErrMsg: %s", err.Error()), 3)
		}
	}()

	// 从ETA试用平台的edb库中读取手工数据分类
	classifyList, e := eta_trial.GetETATrialManualClassify()
	if e != nil {
		err = fmt.Errorf("获取手工数据分类失败, Err: %s", e.Error())
		return
	}
	classifyIds := make([]int, 0)
	for i := range classifyList {
		classifyIds = append(classifyIds, classifyList[i].ClassifyId)
	}

	// 新增用户及权限
	e = eta_trial.InsertTrialUserManualAuth(adminId, adminRealName, classifyIds)
	if e != nil {
		err = fmt.Errorf("新增手工数据权限失败, Err: %s", e.Error())
		return
	}
	return
}

// ApprovalApply 同意审批
func ApprovalApply(approvalId int) (err error) {
	defer func() {
		if err != nil {
			tips := fmt.Sprintf("ETA试用-自动审批失败, ApprovalId: %d, Err: %s", approvalId, err.Error())
			utils.FileLog.Info("%s", tips)
			go alarm_msg.SendAlarmMsg(tips, 3)
		}
	}()

	// 获取审批
	approval, e := eta_trial.GetETATrialApprovalById(approvalId)
	if e != nil {
		err = fmt.Errorf("获取审批失败, Err: %s", e.Error())
		return
	}

	// 更新审批
	if e = eta_trial.ApprovalTrial(approvalId); e != nil {
		err = fmt.Errorf("更新审批失败, Err: %s", e.Error())
		return
	}

	// 如果是新客户申请就新增,旧客户更改账号状态即可
	if approval.ApplyMethod == 2 {
		if e = eta_trial.UpdateETATrialEnable(approval.Mobile); e != nil {
			err = fmt.Errorf("启用失败, Err: %s", e.Error())
			return
		}
		if e = eta_trial.UpdateAdminEnable(approval.Mobile); e != nil {
			err = fmt.Errorf("启用用户失败, Err: %s", e.Error())
			return
		}
	} else {
		//新增客户
		newItem := eta_trial.EtaTrial{
			UserName:    approval.UserName,
			CompanyName: approval.CompanyName,
			Position:    approval.Position,
			Mobile:      approval.Mobile,
			Enabled:     1,
			SellerId:    approval.SellerId,
			Seller:      approval.Seller,
			CreateTime:  time.Now(),
			ModifyTime:  time.Now(),
		}

		strResult := ""
		a := pinyin.NewArgs()
		rows := pinyin.Pinyin(newItem.UserName, a)
		for i := 0; i < len(rows); i++ {
			strResult += rows[i][0]
		}

		//若非中文
		if strResult == "" {
			strResult = newItem.UserName
		}
		list, e := eta_trial.GetETATrialByAccount(strResult)
		if e != nil && e.Error() != utils.ErrNoRow() {
			err = fmt.Errorf("获取ETA试用账号失败, Err: %s", e.Error())
			return
		}
		if list != nil && len(list) > 0 {
			newItem.Account = strResult + strconv.Itoa(len(list))
		} else {
			newItem.Account = strResult
		}

		// 初始密码固定
		newItem.Password = "123456a"

		_, e = eta_trial.AddETATrial(&newItem)
		if e != nil {
			err = fmt.Errorf("新增ETA试用账号失败, Err: %s", e.Error())
			return
		}

		// 新增至试用平台的Admin
		adminItem, e := eta_trial.GetSysUserByRoleAndDepartment("试用", "ETA试用客户")
		if e != nil {
			err = fmt.Errorf("获取ETA试用admin失败, Err: %s", e.Error())
			return
		}

		admin := new(eta_trial.ETATrialAdmin)
		admin.AdminName = newItem.Account
		admin.RealName = newItem.UserName
		admin.Password = utils.MD5(newItem.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 = newItem.Mobile
		admin.RoleType = 0
		admin.RoleId = adminItem.RoleId
		admin.RoleName = "试用"
		admin.RoleTypeCode = "管理员"
		admin.DepartmentId = adminItem.DepartmentId
		admin.DepartmentName = "ETA试用客户"
		admin.Role = "admin"
		admin.Position = approval.Position

		newId, e := eta_trial.AddAdmin(admin)
		if e != nil {
			err = fmt.Errorf("新增ETA试用admin失败, Err: %s", e.Error())
			return
		}

		// 新增试用客户手工权限
		go func() {
			//_ = CreateTrialUserManualAuth(newId, admin.RealName)
			_ = EtaTrialManualUserAddAuth(newId, admin.RealName)
		}()
	}

	// 推送消息给销售
	msgItem := new(company.CompanyApprovalMessage)
	msgItem.CreateUserId = 0 // 系统自动创建的消息
	msgItem.ReceiveUserId = approval.SellerId
	msgItem.MessageStatus = 0
	msgItem.Remark = approval.UserName + approval.ApprovalContent + "通过"
	msgItem.Content = approval.UserName + approval.ApprovalContent + "通过"
	msgItem.CompanyName = approval.CompanyName
	msgItem.CreateTime = time.Now()
	msgItem.ModifyTime = time.Now()
	msgItem.CompanyApprovalId = approvalId
	msgItem.OperationStatus = 1
	msgItem.MessageType = 2    //1:申请消息,2:审批结果,3:文字消息
	msgItem.SourceType = 9     //消息来源
	msgItem.ApprovalStatus = 2 //审批状态,1:待审批,2:已审批,3:已驳回
	err = company.AddCompanyApprovalMessage(msgItem)

	// 更新审批消息(发给所有管理员的)为已读
	//go func() {
	//	cond := ` AND company_approval_id = ? AND source_type = ? AND message_status = ? AND receive_user_id = -1 `
	//	pars := make([]interface{}, 0)
	//	pars = append(pars, approvalId, 9, 0)
	//	_ = company.ModifyCompanyApprovalMessageStatusByCond(cond, pars)
	//}()
	return
}