/*
 * MIT License
 *
 * Copyright (c) 2020 Nicolas JUHEL
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 *
 */

package curves

import (
	"strings"
)

func (v Cipher) String() string {
	return strings.Join(v.Code(), "_")
}

func (v Cipher) Code() []string {
	switch v {
	case TLS_RSA_WITH_AES_128_GCM_SHA256:
		return []string{"rsa", "aes", "128", "gcm", "sha256"}
	case TLS_RSA_WITH_AES_128_GCM:
		return []string{"rsa", "aes", "128", "gcm"}
	case TLS_RSA_WITH_AES128_GCM:
		return []string{"rsa", "aes128", "gcm"}
	case TLS_RSA_WITH_AES_256_GCM_SHA384:
		return []string{"rsa", "aes", "256", "gcm", "sha384"}
	case TLS_RSA_WITH_AES_256_GCM:
		return []string{"rsa", "aes", "256", "gcm"}
	case TLS_RSA_WITH_AES256_GCM:
		return []string{"rsa", "aes256", "gcm"}
	case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
		return []string{"ecdhe", "rsa", "aes", "128", "gcm", "sha256"}
	case TLS_ECDHE_RSA_WITH_AES_128_GCM:
		return []string{"ecdhe", "rsa", "aes", "128", "gcm"}
	case TLS_ECDHE_RSA_WITH_AES128_GCM:
		return []string{"ecdhe", "rsa", "aes128", "gcm"}
	case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
		return []string{"ecdhe", "ecdsa", "aes", "128", "gcm", "sha256"}
	case TLS_ECDHE_ECDSA_WITH_AES_128_GCM:
		return []string{"ecdhe", "ecdsa", "aes", "128", "gcm"}
	case TLS_ECDHE_ECDSA_WITH_AES128_GCM:
		return []string{"ecdhe", "ecdsa", "aes128", "gcm"}
	case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
		return []string{"ecdhe", "rsa", "aes", "256", "gcm", "sha384"}
	case TLS_ECDHE_RSA_WITH_AES_256_GCM:
		return []string{"ecdhe", "rsa", "aes", "256", "gcm"}
	case TLS_ECDHE_RSA_WITH_AES256_GCM:
		return []string{"ecdhe", "rsa", "aes256", "gcm"}
	case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
		return []string{"ecdhe", "ecdsa", "aes", "256", "gcm", "sha384"}
	case TLS_ECDHE_ECDSA_WITH_AES_256_GCM:
		return []string{"ecdhe", "ecdsa", "aes", "256", "gcm"}
	case TLS_ECDHE_ECDSA_WITH_AES256_GCM:
		return []string{"ecdhe", "ecdsa", "aes256", "gcm"}
	case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
		return []string{"ecdhe", "rsa", "chacha20", "poly1305", "sha256"}
	case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:
		return []string{"ecdhe", "rsa", "chacha20", "poly1305"}
	case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
		return []string{"ecdhe", "ecdsa", "chacha20", "poly1305", "sha256"}
	case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
		return []string{"ecdhe", "ecdsa", "chacha20", "poly1305"}
	case TLS_AES_128_GCM_SHA256:
		return []string{"aes", "128", "gcm", "sha256"}
	case TLS_AES_128_GCM:
		return []string{"aes", "128", "gcm"}
	case TLS_AES128_GCM:
		return []string{"aes128", "gcm"}
	case TLS_AES_256_GCM_SHA384:
		return []string{"aes", "256", "gcm", "sha384"}
	case TLS_AES_256_GCM:
		return []string{"aes", "256", "gcm"}
	case TLS_AES256_GCM:
		return []string{"aes256", "gcm"}
	case TLS_CHACHA20_POLY1305_SHA256:
		return []string{"chacha20", "poly1305", "sha256"}
	case TLS_CHACHA20_POLY1305:
		return []string{"chacha20", "poly1305"}
	default:
		return []string{}
	}
}

func (v Cipher) Cipher() uint16 {
	return uint16(v)
}

func (v Cipher) TLS() uint16 {
	return v.Cipher()
}

func (v Cipher) Uint16() uint16 {
	return v.Cipher()
}

func (v Cipher) Uint() uint {
	return uint(v.Cipher())
}

func (v Cipher) Uint32() uint32 {
	return uint32(v.Cipher())
}

func (v Cipher) Uint64() uint64 {
	return uint64(v.Cipher())
}

func (v Cipher) Int() int {
	return int(v.Cipher())
}

func (v Cipher) Int32() int32 {
	return int32(v.Cipher())
}

func (v Cipher) Int64() int64 {
	return int64(v.Cipher())
}
