package querylog

import (
	"net"
	"time"

	"github.com/AdguardTeam/AdGuardHome/dnsfilter"
	"github.com/miekg/dns"
)

// QueryLog - main interface
type QueryLog interface {
	// Close query log object
	Close()

	// Set new configuration at runtime
	// Currently only 'Interval' field is supported.
	Configure(conf Config)

	// Add a log entry
	Add(question *dns.Msg, answer *dns.Msg, result *dnsfilter.Result, elapsed time.Duration, addr net.Addr, upstream string)

	// Get log entries
	GetData(params GetDataParams) []map[string]interface{}

	// Clear memory buffer and remove log files
	Clear()
}

// Config - configuration object
type Config struct {
	BaseDir  string // directory where log file is stored
	Interval uint32 // interval to rotate logs (in hours)
}

// New - create a new instance of the query log
func New(conf Config) QueryLog {
	return newQueryLog(conf)
}

// GetDataParams - parameters for GetData()
type GetDataParams struct {
	OlderThan         time.Time          // return entries that are older than this value
	Domain            string             // filter by domain name in question
	Client            string             // filter by client IP
	QuestionType      uint16             // filter by question type
	ResponseStatus    ResponseStatusType // filter by response status
	StrictMatchDomain bool               // if Domain value must be matched strictly
	StrictMatchClient bool               // if Client value must be matched strictly
}

// ResponseStatusType - response status
type ResponseStatusType int32

// Response status constants
const (
	ResponseStatusAll ResponseStatusType = iota + 1
	ResponseStatusFiltered
)