package nip34

import (
	"strings"

	"github.com/bluekeyes/go-gitdiff/gitdiff"
	"github.com/nbd-wtf/go-nostr"
)

type Patch struct {
	nostr.Event

	Repository nostr.EntityPointer

	Files  []*gitdiff.File
	Header *gitdiff.PatchHeader
}

func ParsePatch(event nostr.Event) Patch {
	patch := Patch{
		Event: event,
	}

	for _, tag := range event.Tags {
		if len(tag) < 2 {
			continue
		}
		switch tag[0] {
		case "a":
			spl := strings.Split(tag[1], ":")
			if len(spl) != 3 {
				continue
			}
			if !nostr.IsValid32ByteHex(spl[1]) {
				continue
			}
			patch.Repository.Kind = nostr.KindRepositoryAnnouncement
			patch.Repository.PublicKey = spl[1]
			patch.Repository.Identifier = spl[2]
			if len(tag) >= 3 {
				patch.Repository.Relays = []string{tag[2]}
			}
		}
	}

	files, preamble, err := gitdiff.Parse(strings.NewReader(event.Content))
	if err != nil {
		return patch
	}
	patch.Files = files

	header, err := gitdiff.ParsePatchHeader(preamble)
	if err != nil {
		return patch
	}
	patch.Header = header

	return patch
}