package test

import (
	"github.com/bluenviron/mediamtx/internal/defs"
	"github.com/bluenviron/mediamtx/internal/logger"
	"github.com/bluenviron/mediamtx/internal/stream"
	"github.com/bluenviron/mediamtx/internal/unit"
)

// StaticSourceParent is a dummy static source parent.
type StaticSourceParent struct {
	stream *stream.Stream
	reader *stream.Reader
	Unit   chan unit.Unit
}

// Log implements logger.Writer.
func (*StaticSourceParent) Log(logger.Level, string, ...interface{}) {}

// Initialize initializes StaticSourceParent.
func (p *StaticSourceParent) Initialize() {
	p.Unit = make(chan unit.Unit)
}

// Close closes StaticSourceParent.
func (p *StaticSourceParent) Close() {
	p.stream.RemoveReader(p.reader)
}

// SetReady implements parent.
func (p *StaticSourceParent) SetReady(req defs.PathSourceStaticSetReadyReq) defs.PathSourceStaticSetReadyRes {
	p.stream = &stream.Stream{
		WriteQueueSize:     512,
		RTPMaxPayloadSize:  1450,
		Desc:               req.Desc,
		GenerateRTPPackets: req.GenerateRTPPackets,
		Parent:             p,
	}
	err := p.stream.Initialize()
	if err != nil {
		panic(err)
	}

	p.reader = &stream.Reader{Parent: NilLogger}

	p.reader.OnData(
		req.Desc.Medias[0],
		req.Desc.Medias[0].Formats[0],
		func(u unit.Unit) error {
			p.Unit <- u
			close(p.Unit)
			return nil
		})

	p.stream.AddReader(p.reader)

	return defs.PathSourceStaticSetReadyRes{Stream: p.stream}
}

// SetNotReady implements parent.
func (StaticSourceParent) SetNotReady(_ defs.PathSourceStaticSetNotReadyReq) {}
