// Copyright 2017 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package app

import "strings"

// parseQueryString splits a user-entered query into one or more storage server queries.
// The supported query formats are:
//
//	prefix | one vs two  - parsed as "prefix", {"one", "two"}
//	prefix one vs two    - parsed as "", {"prefix one", "two"}
//	anything else        - parsed as "", {"anything else"}
//
// The vs and | separators must not be quoted.
func parseQueryString(q string) (string, []string) {
	var queries []string
	var parts []string
	var prefix string
	quoting := false
	for r := 0; r < len(q); {
		switch c := q[r]; {
		case c == '"' && quoting:
			quoting = false
			r++
		case quoting:
			if c == '\\' {
				r++
			}
			r++
		case c == '"':
			quoting = true
			r++
		case c == ' ', c == '\t':
			switch part := q[:r]; {
			case part == "|" && prefix == "":
				prefix = strings.Join(parts, " ")
				parts = nil
			case part == "vs":
				queries = append(queries, strings.Join(parts, " "))
				parts = nil
			default:
				parts = append(parts, part)
			}
			q = q[r+1:]
			r = 0
		default:
			if c == '\\' {
				r++
			}
			r++
		}
	}
	if len(q) > 0 {
		parts = append(parts, q)
	}
	if len(parts) > 0 {
		queries = append(queries, strings.Join(parts, " "))
	}
	return prefix, queries
}
