package codec

import (
	"time"

	"github.com/deepch/vdk/av"
	"github.com/deepch/vdk/codec/fake"
)

type OpusCodecData struct {
	typ            av.CodecType
	SampleRate_    int
	ChannelLayout_ av.ChannelLayout
}

func (self OpusCodecData) Type() av.CodecType {
	return self.typ
}

func (self OpusCodecData) SampleRate() int {
	return self.SampleRate_
}

func (self OpusCodecData) ChannelLayout() av.ChannelLayout {
	return self.ChannelLayout_
}

func (self OpusCodecData) PacketDuration(data []byte) (time.Duration, error) {
	return time.Duration(20) * time.Millisecond, nil
}

func (self OpusCodecData) SampleFormat() av.SampleFormat {
	return av.FLT
}

type PCMUCodecData struct {
	typ av.CodecType
}

func (self PCMUCodecData) Type() av.CodecType {
	return self.typ
}

func (self PCMUCodecData) SampleRate() int {
	return 8000
}

func (self PCMUCodecData) ChannelLayout() av.ChannelLayout {
	return av.CH_MONO
}

func (self PCMUCodecData) SampleFormat() av.SampleFormat {
	return av.S16
}

func (self PCMUCodecData) PacketDuration(data []byte) (time.Duration, error) {
	return time.Duration(len(data)) * time.Second / time.Duration(8000), nil
}

func NewPCMMulawCodecData() av.AudioCodecData {
	return PCMUCodecData{
		typ: av.PCM_MULAW,
	}
}

func NewPCMCodecData() av.AudioCodecData {
	return PCMUCodecData{
		typ: av.PCM,
	}
}

func NewPCMAlawCodecData() av.AudioCodecData {
	return PCMUCodecData{
		typ: av.PCM_ALAW,
	}
}
func NewOpusCodecData(sr int, cc av.ChannelLayout) av.AudioCodecData {
	return OpusCodecData{
		typ:            av.OPUS,
		SampleRate_:    sr,
		ChannelLayout_: cc,
	}
}

type SpeexCodecData struct {
	fake.CodecData
}

func (self SpeexCodecData) PacketDuration(data []byte) (time.Duration, error) {
	return time.Millisecond * 20, nil
}

func NewSpeexCodecData(sr int, cl av.ChannelLayout) SpeexCodecData {
	codec := SpeexCodecData{}
	codec.CodecType_ = av.SPEEX
	codec.SampleFormat_ = av.S16
	codec.SampleRate_ = sr
	codec.ChannelLayout_ = cl
	return codec
}