package nip10

import "github.com/nbd-wtf/go-nostr"

func GetThreadRoot(tags nostr.Tags) *nostr.EventPointer {
	for _, tag := range tags {
		if len(tag) >= 4 && tag[0] == "e" && tag[3] == "root" {
			p, _ := nostr.EventPointerFromTag(tag)
			return &p
		}
	}

	firstE := tags.Find("e")
	if firstE != nil {
		return &nostr.EventPointer{
			ID: firstE[1],
		}
	}

	return nil
}

func GetImmediateParent(tags nostr.Tags) *nostr.EventPointer {
	var parent nostr.Tag
	var lastE nostr.Tag

	for i := 0; i <= len(tags)-1; i++ {
		tag := tags[i]

		if len(tag) < 2 {
			continue
		}
		if tag[0] != "e" && tag[0] != "a" {
			continue
		}

		if len(tag) >= 4 {
			if tag[3] == "reply" {
				parent = tag
				break
			}
			if tag[3] == "parent" {
				// will be used as our first fallback
				parent = tag
				continue
			}
			if tag[3] == "mention" {
				// this invalidates this tag as a second fallback mechanism (clients that don't add markers)
				continue
			}
		}

		lastE = tag // will be used as our second fallback (clients that don't add markers)
	}

	// if we reached this point we don't have a "reply", but if we have a "parent"
	// that means this event is a direct reply to the parent
	if parent != nil {
		p, _ := nostr.EventPointerFromTag(parent)
		return &p
	}

	if lastE != nil {
		// if we reached this point and we have at least one "e" we'll use that (the last)
		// (we don't bother looking for relay or author hints because these clients don't add these anyway)
		return &nostr.EventPointer{
			ID: lastE[1],
		}
	}

	return nil
}
