package outboundintentv1

import (
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"testing"
)

func TestDecodeMailDeliveryV3PreservesImmutableAttachmentReferences(t *testing.T) {
	payload := MailDeliveryV3{
		Version: MailPayloadFormatV3, AuthorizedActorID: "user-1",
		ToAddresses: []string{"to@example.com"}, Subject: "Subject", TextBody: "Body",
		Attachments: []MailAttachmentV1{{
			FileID: "file-version-1", FileName: "資料.pdf", ContentType: "application/pdf",
			ContentLength: 4, ContentDigest: "sha256:" + string(make([]byte, 64)),
		}},
	}
	payload.Attachments[0].ContentDigest = "sha256:" + hex.EncodeToString(make([]byte, sha256.Size))
	raw, err := json.Marshal(payload)
	if err != nil {
		t.Fatal(err)
	}
	intent := testIntent(raw, 41)
	intent.Operation = OperationSendMail
	intent.PayloadFormatVersion = MailPayloadFormatV3
	got, err := DecodeMailDeliveryV3(intent)
	if err != nil {
		t.Fatalf("DecodeMailDeliveryV3: %v", err)
	}
	if len(got.Attachments) != 1 || got.Attachments[0].FileName != "資料.pdf" || got.Attachments[0].FileID != "file-version-1" {
		t.Fatalf("attachments = %#v", got.Attachments)
	}
}

func TestMailDeliveryV3RejectsDuplicateAndOversizeAttachments(t *testing.T) {
	digest := "sha256:" + hex.EncodeToString(make([]byte, sha256.Size))
	base := MailDeliveryV3{
		Version: MailPayloadFormatV3, AuthorizedActorID: "user-1",
		ToAddresses: []string{"to@example.com"}, Subject: "Subject", TextBody: "Body",
		Attachments: []MailAttachmentV1{{FileID: "file-1", FileName: "a.pdf", ContentType: "application/pdf", ContentLength: 1, ContentDigest: digest}},
	}
	if validateMailDeliveryV3(base) != nil {
		t.Fatal("valid payload rejected")
	}
	duplicate := base
	duplicate.Attachments = append(append([]MailAttachmentV1(nil), base.Attachments...), base.Attachments[0])
	if validateMailDeliveryV3(duplicate) == nil {
		t.Fatal("duplicate attachment accepted")
	}
	oversize := base
	oversize.Attachments = append([]MailAttachmentV1(nil), base.Attachments...)
	oversize.Attachments[0].ContentLength = MaxMailAttachmentBytes + 1
	if validateMailDeliveryV3(oversize) == nil {
		t.Fatal("oversize attachment accepted")
	}
}
