package authority

import (
	"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/errorcode"
	"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/db"
	"context"
	"fmt"
	"time"

	"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/svc"
	"chainweaver.org.cn/chainweaver/did/did-mgr-common-service/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type AuthorityBatchAuditLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewAuthorityBatchAuditLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AuthorityBatchAuditLogic {
	return &AuthorityBatchAuditLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *AuthorityBatchAuditLogic) AuthorityBatchAudit(req *types.BatchAuditReq) (resp *types.CommonResp, err error) {
	resp = &types.CommonResp{
		Code: types.SucceedCode,
		Msg:  types.SucceedMsg,
	}

	// 当前只支持审核通过与审核驳回两种批量操作
	if !(req.AuditState == 2 || req.AuditState == 3) {
		errorcode.SystemInternalError.BuildResult(resp, fmt.Errorf("请求操作类型只能是审核通过与驳回"))
		return resp, nil
	}
	orgInfos := make([]*db.IssueOrganizationInfo, 0)

	// 检查本地数据是否为空,并判断状态是否属于待审核状态
	for _, orgId := range req.OrgId {
		//查询本地数据库,检查本地颁证机构状态
		orgInfo, err := db.FindIssueOrganizationInfoByOrgId(orgId)
		if err != nil {
			errorcode.MysqlErrorQuery.BuildResult(resp, err)
			l.Logger.Errorf("query issueOrganizationInfo failed,err[%s]", err.Error())
			return resp, nil
		}

		// 检查审核状态是否有效 当前只能支持待审核到通过与驳回状态
		if orgInfo.AuditState != 1 {
			errorcode.SystemInternalError.BuildResult(resp, fmt.Errorf("The current state cannot change "))
			return resp, nil
		}
		orgInfos = append(orgInfos, orgInfo)
	}

	for _, orgInfo := range orgInfos {
		if req.AuditState == 2 {
			orgInfo.OldEmail = orgInfo.Email
			orgInfo.OldPhoneNumber = orgInfo.PhoneNumber
			orgInfo.OldContactsName = orgInfo.ContactsName
		}
		// 更新本地数据库
		orgInfo.AuditTime = time.Now()
		orgInfo.AuditState = req.AuditState
		err = db.UpdateIssueOrganizationInfo(orgInfo)
		if err != nil {
			errorcode.MysqlErrorUpdate.BuildResult(resp, err)
			l.Logger.Errorf("update issueOrganizationInfo failed,err[%s]", err.Error())
			return resp, nil
		}
	}

	return resp, nil
}