package nip34

import (
	"strings"

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

type RepositoryState struct {
	nostr.Event

	ID       string
	HEAD     string
	Tags     map[string]string
	Branches map[string]string
}

func ParseRepositoryState(event nostr.Event) RepositoryState {
	st := RepositoryState{
		Event:    event,
		Tags:     make(map[string]string),
		Branches: make(map[string]string),
	}

	for _, tag := range event.Tags {
		if len(tag) < 2 {
			continue
		}
		switch tag[0] {
		case "d":
			st.ID = tag[1]
		case "HEAD":
			if strings.HasPrefix(tag[1], "ref: refs/heads/") {
				st.HEAD = tag[1][16:]
			}
		default:
			if strings.HasPrefix(tag[0], "refs/heads/") {
				st.Branches[tag[0][11:]] = tag[1]
			} else if strings.HasPrefix(tag[0], "refs/tags/") {
				st.Tags[tag[0][10:]] = tag[1]
			}
		}
	}

	return st
}

func (rs RepositoryState) ToEvent() *nostr.Event {
	tags := make(nostr.Tags, 1, 2+len(rs.Branches)+len(rs.Tags))

	tags[0] = nostr.Tag{"d", rs.ID}
	for branchName, commitId := range rs.Branches {
		tags = append(tags, nostr.Tag{"refs/heads/" + branchName, commitId})
	}
	for tagName, commitId := range rs.Tags {
		tags = append(tags, nostr.Tag{"refs/tags/" + tagName, commitId})
	}
	if rs.HEAD != "" {
		tags = append(tags, nostr.Tag{"HEAD", "ref: refs/heads/" + rs.HEAD})
	}

	return &nostr.Event{
		Kind:      30618,
		Tags:      tags,
		CreatedAt: nostr.Now(),
	}
}