package cmux

import (
	"net"

	"quyun/v2/providers/grpc"
	"quyun/v2/providers/http"

	"github.com/soheilhy/cmux"
	"go.ipao.vip/atom/container"
	"go.ipao.vip/atom/opt"
)

func Provide(opts ...opt.Option) error {
	o := opt.New(opts...)
	var config Config
	if err := o.UnmarshalConfig(&config); err != nil {
		return err
	}
	return container.Container.Provide(func(http *http.Service, grpc *grpc.Grpc) (*CMux, error) {
		l, err := net.Listen("tcp", config.Address())
		if err != nil {
			return nil, err
		}

		mux := &CMux{
			Http: http,
			Grpc: grpc,
			Mux:  cmux.New(l),
			Base: l,
		}
		// Ensure cmux stops accepting new connections on shutdown
		container.AddCloseAble(func() { _ = l.Close() })

		return mux, nil
	}, o.DiOptions()...)
}
