//go:generate ${GOBIN}/mockgen -destination document_cli_mock.go -package=document ${GO_MODULE}/infra/lark/client/document Document
package document

import (
	"context"
	"fmt"

	lark "github.com/larksuite/oapi-sdk-go/v3"
	larkdocx "github.com/larksuite/oapi-sdk-go/v3/service/docx/v1"
)

type Document interface {
	GetDocument(ctx context.Context, documentID string) (*larkdocx.Document, error)

	// helpers
	NewDefaultDocumentBuilder(docTitle string) (DocumentBuilder, error)
	GenerateURLFromDocumentID(documentID string, isWiki bool) string
}

type docCli struct {
	larkCli     *lark.Client
	larkBaseURL string
}

func (dc *docCli) GetDocument(ctx context.Context, documentID string) (*larkdocx.Document, error) {
	req := larkdocx.NewGetDocumentReqBuilder().
		DocumentId(documentID).
		Build()
	resp, err := dc.larkCli.Docx.V1.Document.Get(ctx, req)
	if err != nil {
		return nil, err
	}

	if !resp.Success() {
		return nil, fmt.Errorf("request failed, code: %d, message: %s, requestId: %s", resp.Code, resp.Msg, resp.RequestId())
	}

	return resp.Data.Document, nil
}

func New(larkCli *lark.Client, larkBaseURL string) Document {
	return &docCli{
		larkCli:     larkCli,
		larkBaseURL: larkBaseURL,
	}
}
