package deb822

import (
	"bufio"
	"fmt"
	"strings"
)

/*ParseStream parses a stream and returns an array of maps, where
/* each map contains all the fields of an RFC822 stanza */
func ParseStream(stream *bufio.Scanner) (Stanzas, int) {

	s := make(Stanzas, 10)
	curSize := 10
	for i := 0; i < 10; i++ {
		s[i] = make(map[string]string)
	}
	curStanza := 0
	curField := ""
	for stream.Scan() {
		if strings.TrimSpace(stream.Text()) == "" {
			if curField == "" {
				continue
			}
			curStanza++
			curField = ""
			fmt.Printf("==== New stanza ==== (Nr. %d/%d)\n", curStanza, curSize)
			if curStanza >= curSize {
				newS := make(Stanzas, curSize*2)
				for i := curSize; i < curSize*2; i++ {
					newS[i] = make(map[string]string)
				}
				curSize *= 2
				copy(newS, s)
				s = newS
			}
			continue
		}

		//fmt.Printf("line: %s\n", stream.Text())
		field := strings.SplitN(stream.Text(), ":", 2)
		//fmt.Printf("field: %s\n", field)
		if len(field) > 1 {
			/* This is a new field*/
			curField = field[0]
			s[curStanza][curField] = strings.TrimSpace(field[1])
		} else {
			/* this is the continuation of the last field */
			s[curStanza][curField] += "\n" + field[0]
		}
	}
	return s, curStanza
}

/*ScanStanza reads a single RFC822 stanza from a stream and returns
/* it as a map */
func ScanStanza(stream *bufio.Scanner) (Stanza, error) {

	s := make(Stanza)

	curField := ""
	for stream.Scan() {
		if strings.TrimSpace(stream.Text()) == "" {
			return s, nil
		}

		field := strings.SplitN(stream.Text(), ":", 2)
		if len(field) > 1 {
			/* This is a new field*/
			curField = field[0]
			s[curField] = strings.TrimSpace(field[1])
		} else {
			/* this is the continuation of the last field */
			s[curField] += "\n" + field[0]
		}
	}

	err := stream.Err()
	return s, err
}