package plugin

import (
	"flag"

	"github.com/Kong/go-pdk"

	"github.com/tidbcloud/audit-kong/logger"
)

type Plugin struct {
	logger  *logger.TimeRotatingLogger
	channel chan []byte
}

func NewPlugin() any {
	if dump := flag.Lookup("dump"); dump != nil && dump.Value.String() == "true" {
		// do not start any background tasks to mess with the output
		return &Plugin{}
	}

	plg := &Plugin{
		logger:  logger.GetLogger(),
		channel: make(chan []byte),
	}
	go plg.collect()
	return plg
}

func (plg Plugin) Log(kong *pdk.PDK) {
	msg, err := kong.Log.Serialize()
	if err != nil {
		return
	}
	plg.channel <- []byte(msg)
}

func (plg Plugin) collect() {
	for {
		b := <-plg.channel
		b2, err := convertFields(b)
		if err != nil {
			b2 = b // fallback to original message
		} else if b2 == nil {
			continue // often skip for `GET`
		}

		_, _ = plg.logger.Write(b2)
		_, _ = plg.logger.Write([]byte("\n"))
	}
}
