package v1

import (
	"bytes"
	"context"
	"encoding/json"

	"github.com/pingcap-inc/pchub/pkg/errors"
	"github.com/pingcap-inc/pchub/pkg/log"

	"github.com/pingcap-inc/security/internal/pkg/code"
	v1 "github.com/pingcap-inc/security/model/v1"
)

type MessageBody struct {
	ReceiveID string `json:"receive_id,omitempty"`
	MsgType   string `json:"msg_type"`
	Content   string `json:"content"`
	Uuid      string `json:"uuid"`
}

func ReplyLarkMsg(ctx context.Context, msgID string, msgBody MessageBody, token string) (*v1.LarkReplyMsgResData, error) {
	log.L(ctx).Info("ReplyLarkMsg Called.")

	reqb, err := json.Marshal(msgBody)
	if err != nil {
		log.L(ctx).Errorf("error when marshal reply msg request body, err: %s", err.Error())

		return nil, errors.WithCode(code.ErrEncodingJSON, "")
	}

	jsonraw, err := comSrv.GetDataByReqLarkAPI(ctx, "POST", LarkOpenAPIBase+"/im/v1/messages/"+msgID+"/reply", bytes.NewReader(reqb), nil, token)
	if err != nil {
		log.L(ctx).Errorf("error when call lark send msg api, err: %s", err.Error())

		return nil, errors.WithCode(code.ErrHttpRequest, "")
	}

	var larkm v1.LarkReplyMsgResData
	if err = json.Unmarshal(jsonraw, &larkm); err != nil {
		log.L(ctx).Errorf("error when unmarshal lark msg, err: %s", err.Error())

		return nil, errors.WithCode(code.ErrDecodingJSON, "")
	}

	log.L(ctx).Infof("ReplyLarkMsg success, msgID: %s", msgID)

	return &larkm, nil
}

func SendLarkMsg(ctx context.Context, idType string, msgBody MessageBody) (*v1.LarkReplyMsgResData, error) {
	reqb, err := json.Marshal(msgBody)
	if err != nil {
		log.L(ctx).Errorf("error when marshal reply msg request body, err: %s", err.Error())

		return nil, errors.WithCode(code.ErrEncodingJSON, "")
	}

	tok, _ := comSrv.GetLarkToken(ctx, dataSafe)

	jsonraw, err := comSrv.GetDataByReqLarkAPI(ctx, "POST", LarkOpenAPIBase+"/im/v1/messages?receive_id_type="+idType, bytes.NewReader(reqb), nil, tok)
	if err != nil {
		log.L(ctx).Errorf("error when call lark send msg api, err: %s", err.Error())

		return nil, errors.WithCode(code.ErrHttpRequest, "")
	}

	var larkm v1.LarkReplyMsgResData
	if err = json.Unmarshal(jsonraw, &larkm); err != nil {
		log.L(ctx).Errorf("error when unmarshal lark msg, err: %s", err.Error())

		return nil, errors.WithCode(code.ErrDecodingJSON, "")
	}

	return &larkm, nil
}
