package apirequest

import (
	"bytes"
	"encoding/json"
	"fmt"
	"mime/multipart"
	"net/http"

	"codeberg.org/vlbeaudoin/voki"
	"codeberg.org/vlbeaudoin/voki/request"
	"git.agecem.com/agecem/agecem-org/apiresponse"
)

var _ request.Requester[apiresponse.V1DocumentPOST] = V1DocumentPOST{}

type V1DocumentPOST struct {
	Data struct {
		Bucket   string
		Document *multipart.FileHeader
	}
}

func NewV1DocumentPOST(bucket string, document *multipart.FileHeader) (request V1DocumentPOST, err error) {
	if bucket == "" {
		err = fmt.Errorf("NewV1DocumentPOST requires non-nil bucket name")
		return
	}

	request.Data.Bucket = bucket

	if document == nil {
		err = fmt.Errorf("NewV1DocumentPOST requires non-nil document")
		return
	}

	request.Data.Document = document

	return
}

func (request V1DocumentPOST) Complete() bool {
	return request.Data.Bucket != "" && request.Data.Document != nil
}

func (request V1DocumentPOST) Request(v *voki.Voki) (response apiresponse.V1DocumentPOST, err error) {
	if !request.Complete() {
		err = fmt.Errorf("Incomplete V1DocumentPOST request")
		return
	}

	var buf bytes.Buffer
	if err = json.NewEncoder(&buf).Encode(request.Data); err != nil {
		return
	}

	return response, v.UnmarshalIfComplete(http.MethodPost, fmt.Sprintf("/v1/bucket/%s", request.Data.Bucket), &buf, true, &response)
}
