package fields

import (
	"fmt"
	"strings"

	E "github.com/yusing/go-proxy/internal/error"
)

type StreamScheme struct {
	ListeningScheme Scheme `json:"listening"`
	ProxyScheme     Scheme `json:"proxy"`
}

func ValidateStreamScheme(s string) (ss *StreamScheme, err E.NestedError) {
	ss = &StreamScheme{}
	parts := strings.Split(s, ":")
	if len(parts) == 1 {
		parts = []string{s, s}
	} else if len(parts) != 2 {
		return nil, E.Invalid("stream scheme", s)
	}
	ss.ListeningScheme, err = NewScheme(parts[0])
	if err.HasError() {
		return nil, err
	}
	ss.ProxyScheme, err = NewScheme(parts[1])
	if err.HasError() {
		return nil, err
	}
	return ss, nil
}

func (s StreamScheme) String() string {
	return fmt.Sprintf("%s:%s", s.ListeningScheme, s.ProxyScheme)
}

// IsCoherent checks if the ListeningScheme and ProxyScheme of the StreamScheme are equal.
//
// It returns a boolean value indicating whether the ListeningScheme and ProxyScheme are equal.
func (s StreamScheme) IsCoherent() bool {
	return s.ListeningScheme == s.ProxyScheme
}