package main

import (
	"encoding/base64"
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/pingcap-inc/nexuscrm-contract/pkg/approvalir"
)

func TestRunWritesCatalogConsumableCanonicalBundle(t *testing.T) {
	directory := t.TempDir()
	input := filepath.Join(directory, "approval.seed.json")
	metadataInput := filepath.Join(directory, "account.approvalProcess")
	output := filepath.Join(directory, "approval-publication.json")
	metadata := base64.StdEncoding.EncodeToString([]byte(`{"approvalStep":[{"name":"Manager","label":"Manager","assignedApprover":{"approver":{"name":"OwnerId","type":"relatedUserField"}},"rejectBehavior":{"type":"RejectRequest"}}]}`))
	seed := `{"processDefinitions":[{"id":"definition-1","developerName":"Review","name":"Review","tableEnumOrId":"WorkItem","state":"Active","isActive":true,"metadataBase64":"` + metadata + `"}],"processNodes":[],"processActions":[]}`
	if err := os.WriteFile(input, []byte(seed), 0o600); err != nil {
		t.Fatal(err)
	}
	accountMetadata := `<ApprovalProcess><active>true</active><label>Account Review</label><approvalStep><name>Manager</name><label>Manager</label><assignedApprover><approver><name>OwnerId</name><type>relatedUserField</type></approver></assignedApprover><rejectBehavior><type>RejectRequest</type></rejectBehavior></approvalStep></ApprovalProcess>`
	if err := os.WriteFile(metadataInput, []byte(accountMetadata), 0o600); err != nil {
		t.Fatal(err)
	}
	digest := "sha256:" + strings.Repeat("a", 64)
	if err := run([]string{
		"-metadata-source-digest", digest,
		"-input", input,
		"-metadata-input", "Account/Account_Review=" + metadataInput,
		"-output", output,
	}); err != nil {
		t.Fatal(err)
	}
	raw, err := os.ReadFile(output)
	if err != nil {
		t.Fatal(err)
	}
	bundle, _, err := approvalir.DecodePublicationBundle(raw, nil)
	if err != nil {
		t.Fatalf("Catalog rejected CLI output: %v", err)
	}
	if len(bundle.Definitions) != 2 || bundle.Definitions[0].ObjectID != "Account" || bundle.Definitions[1].ObjectID != "WorkItem" {
		t.Fatalf("definitions = %#v", bundle.Definitions)
	}
}
