package domain

import (
	"mime"
	"strings"
)

type MediaType struct {
	mainType  string
	subType   string
	mediaType string
}

// NewMediaType creates a new MediaType domain from raw string in
// the 'MainType/SubType' format.
func NewMediaType(raw string) MediaType {
	parts := strings.Split(raw, "/")
	if len(parts) < 2 {
		return MediaType{}
	}

	return MediaType{
		mainType:  parts[0],
		subType:   parts[1],
		mediaType: mime.FormatMediaType(strings.Join([]string{parts[0], parts[1]}, "/"), nil),
	}
}

// Type returns main part of MediaType.
// For 'image/jpeg' it returns 'image'.
func (mt MediaType) MainType() string {
	return mt.mainType
}

// Type returns sub part of MediaType.
// For 'image/jpeg' it returns 'jpeg'.
func (mt MediaType) SubType() string {
	return mt.subType
}

// Type returns 'MainType/SubType' string.
func (mt MediaType) Type() string {
	return mt.mediaType
}

func (mt MediaType) String() string {
	return mt.mediaType
}

func (mt MediaType) GoString() string {
	return "domain.MediaType(" + mt.mediaType + ")"
}
