package syslog

import (
	"fmt"
	"strings"
)

// Framing represents the framing technique we expect the messages to come.
type Framing int

const (
	// OctetCounting indicates the transparent framing technique for syslog transport.
	OctetCounting Framing = iota
	// NonTransparent indicates the non-transparent framing technique for syslog transport.
	NonTransparent
)

func (f Framing) String() string {
	switch f {
	case OctetCounting:
		return "OCTET-COUNTING"
	case NonTransparent:
		return "NON-TRANSPARENT"
	}
	return ""
}

// UnmarshalTOML implements ability to unmarshal framing from TOML files.
func (f *Framing) UnmarshalTOML(data []byte) (err error) {
	return f.UnmarshalText(data)
}

// UnmarshalText implements encoding.TextUnmarshaler
func (f *Framing) UnmarshalText(data []byte) (err error) {
	s := string(data)
	switch strings.ToUpper(s) {
	case `OCTET-COUNTING`:
		fallthrough
	case `"OCTET-COUNTING"`:
		fallthrough
	case `'OCTET-COUNTING'`:
		*f = OctetCounting
		return

	case `NON-TRANSPARENT`:
		fallthrough
	case `"NON-TRANSPARENT"`:
		fallthrough
	case `'NON-TRANSPARENT'`:
		*f = NonTransparent
		return
	}
	*f = -1
	return fmt.Errorf("unknown framing")
}

// MarshalText implements encoding.TextMarshaler
func (f Framing) MarshalText() ([]byte, error) {
	s := f.String()
	if s != "" {
		return []byte(s), nil
	}
	return nil, fmt.Errorf("unknown framing")
}