package common

import (
	"io"
	"path/filepath"
	"strings"

	"go.uber.org/zap"
)

type DecoderParams struct {
	Reader    io.ReadSeeker // required
	Extension string        // required, source extension, eg. ".mp3"

	FilePath string // optional, source file path

	Logger *zap.Logger // required

	// KuGou
	KggDatabasePath string
}
type NewDecoderFunc func(p *DecoderParams) Decoder

type DecoderFactory struct {
	noop   bool
	Suffix string
	Create NewDecoderFunc
}

var DecoderRegistry []DecoderFactory

func RegisterDecoder(ext string, noop bool, dispatchFunc NewDecoderFunc) {
	DecoderRegistry = append(DecoderRegistry,
		DecoderFactory{noop: noop, Create: dispatchFunc, Suffix: "." + strings.TrimPrefix(ext, ".")})
}

func GetDecoder(filename string, skipNoop bool) []DecoderFactory {
	var result []DecoderFactory
	// Some extensions contains multiple dots, e.g. ".kgm.flac", hence iterate
	//   all decoders for each extension.
	name := strings.ToLower(filepath.Base(filename))
	for _, dec := range DecoderRegistry {
		if !strings.HasSuffix(name, dec.Suffix) {
			continue
		}
		if skipNoop && dec.noop {
			continue
		}
		result = append(result, dec)
	}
	return result
}
