package evepraisal

import (
	"github.com/evepraisal/go-evepraisal/parsers"
	"github.com/evepraisal/go-evepraisal/typedb"
)

// NewContextMultiParser implements a parser that knows about what types exist. This makes it much more powerful
// and prevents accidentally parsing one format as another
func NewContextMultiParser(typeDB typedb.TypeDB, parserList []parsers.Parser) parsers.Parser {
	return parsers.Parser(
		func(input parsers.Input) (parsers.ParserResult, parsers.Input) {
			multiParserResult := &parsers.MultiParserResult{}
			left := input
			for _, parser := range parserList {
				if len(left) == 0 {
					break
				}
				var result parsers.ParserResult
				result, left = parser(left)
				if result != nil && len(result.Lines()) > 0 {
					foundRealType := false
					for _, item := range parserResultToAppraisalItems(result) {
						if typeDB.HasType(item.Name) {
							foundRealType = true
							break
						}
					}

					// We don't like this result, move ahead!
					if !foundRealType {
						continue
					}
					multiParserResult.Results = append(multiParserResult.Results, result)
				}
			}
			return multiParserResult, left
		})
}