package util

import "encoding/json"

func EncodeApprovalForms(forms []ApprovalForm) (string, error) {
	// convert to map
	data, err := json.Marshal(forms)
	if err != nil {
		return "", err
	}
	m := []map[string]any{}
	err = json.Unmarshal(data, &m)
	if err != nil {
		return "", err
	}

	// add type field
	for i, f := range m {
		f["type"] = forms[i].Type()
	}

	// convert to string
	data, err = json.Marshal(m)
	if err != nil {
		return "", err
	}
	return string(data), nil
}

// ApprovalForm is the interface for lark approval form
//
// Reference: https://open.feishu.cn/document/server-docs/approval-v4/approval/create#39ee4e65
type ApprovalForm interface {
	Type() string
}

type ApprovalFormInput struct {
	ID    string `json:"id"`
	Value string `json:"value"`
}

func (f ApprovalFormInput) Type() string {
	return "input"
}

type ApprovalFormTextarea struct {
	ID    string `json:"id"`
	Value string `json:"value"`
}

func (f ApprovalFormTextarea) Type() string {
	return "textarea"
}

type ApprovalFormRadio struct {
	ID    string `json:"id"`
	Value string `json:"value"`
}

func (f ApprovalFormRadio) Type() string {
	return "radioV2"
}
