package netsplit

import (
	`encoding/xml`
	`errors`
	`fmt`
	`io`
	`net/netip`
	`strings`
)

// UnmarshalXML conforms an IANAPrefix to (encoding/xml).Unmarshaler.
func (i *IANAPrefix) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err error) {

	var tok xml.Token
	var nextRefIdx int
	var ref *IANARef
	var pfxStr []string
	var sb *strings.Builder = new(strings.Builder)

	for {
		if tok, err = d.Token(); err != nil {
			if errors.Is(err, io.EOF) {
				err = nil
				break
			}
			return
		}
		switch t := tok.(type) {
		case xml.CharData:
			sb.Write(t)
		case xml.StartElement:
			switch t.Name.Local {
			case "xref":
				ref = new(IANARef)
				if err = d.DecodeElement(ref, &t); err != nil {
					return
				}
				if i.References == nil {
					i.References = make([]*IANARef, 0)
				}
				i.References = append(i.References, ref)
				// No reference for these; they should be only network addrs.
				// fmt.Fprintf(sb, "[REF %d]", nextRefIdx)
				nextRefIdx++
			default:
				fmt.Println(t.Name.Local)
				continue
			}
		}
	}

	pfxStr = strings.Split(sb.String(), ",")
	i.Prefixes = make([]*netip.Prefix, len(pfxStr))
	for idx, p := range pfxStr {
		i.Prefixes[idx] = new(netip.Prefix)
		if *i.Prefixes[idx], err = netip.ParsePrefix(
			strings.TrimSpace(p),
		); err != nil {
			return
		}
	}

	return
}