package tm

import (
	"bytes"
	"errors"
	"github.com/unlock-music/cli/algo/common"
)

var replaceHeader = []byte{0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70}
var magicHeader = []byte{0x51, 0x51, 0x4D, 0x55} //0x15, 0x1D, 0x1A, 0x21

type Decoder struct {
	file        []byte
	audio       []byte
	headerMatch bool
	audioExt    string
}

func (d *Decoder) GetCoverImage() []byte {
	return nil
}

func (d *Decoder) GetAudioData() []byte {
	return d.audio
}

func (d *Decoder) GetAudioExt() string {
	if d.audioExt != "" {
		return "." + d.audioExt
	}
	return ""
}

func (d *Decoder) GetMeta() common.Meta {
	return nil
}

func (d *Decoder) Validate() error {
	if len(d.file) < 8 {
		return errors.New("invalid file size")
	}
	if !bytes.Equal(magicHeader, d.file[:4]) {
		return errors.New("not a valid tm file")
	}
	d.headerMatch = true
	return nil
}

func (d *Decoder) Decode() error {
	d.audio = d.file
	if d.headerMatch {
		for i := 0; i < 8; i++ {
			d.audio[i] = replaceHeader[i]
		}
		d.audioExt = "m4a"
	}
	return nil
}

//goland:noinspection GoUnusedExportedFunction
func NewDecoder(data []byte) common.Decoder {
	return &Decoder{file: data}
}

func DecoderFuncWithExt(ext string) common.NewDecoderFunc {
	return func(file []byte) common.Decoder {
		return &Decoder{file: file, audioExt: ext}
	}
}

func init() {
	// QQ Music IOS M4a
	common.RegisterDecoder("tm2", false, DecoderFuncWithExt("m4a"))
	common.RegisterDecoder("tm6", false, DecoderFuncWithExt("m4a"))
	// QQ Music IOS Mp3
	common.RegisterDecoder("tm0", false, common.NewRawDecoder)
	common.RegisterDecoder("tm3", false, common.NewRawDecoder)

}