package querylog

import "time"

// searchParams represent the search query sent by the client
type searchParams struct {
	// searchCriteria - list of search criteria that we use to get filter results
	searchCriteria []searchCriterion

	// olderThen - return entries that are older than this value
	// if not set - disregard it and return any value
	olderThan time.Time

	offset             int // offset for the search
	limit              int // limit the number of records returned
	maxFileScanEntries int // maximum log entries to scan in query log files. if 0 - no limit
}

// newSearchParams - creates an empty instance of searchParams
func newSearchParams() *searchParams {
	return &searchParams{
		// default max log entries to return
		limit: 500,

		// by default, we scan up to 50k entries at once
		maxFileScanEntries: 50000,
	}
}

// quickMatchClientFunc is a simplified client finder for quick matches.
type quickMatchClientFunc = func(clientID, ip string) (c *Client)

// quickMatch quickly checks if the line matches the given search parameters.
// It returns false if the line doesn't match.  This method is only here for
// optimisation purposes.
func (s *searchParams) quickMatch(line string, findClient quickMatchClientFunc) (ok bool) {
	for _, c := range s.searchCriteria {
		if !c.quickMatch(line, findClient) {
			return false
		}
	}

	return true
}

// match - checks if the logEntry matches the searchParams
func (s *searchParams) match(entry *logEntry) bool {
	if !s.olderThan.IsZero() && entry.Time.UnixNano() >= s.olderThan.UnixNano() {
		// Ignore entries newer than what was requested
		return false
	}

	for _, c := range s.searchCriteria {
		if !c.match(entry) {
			return false
		}
	}

	return true
}