package main

import (
	"fmt"
	"reflect"
	"strings"
)

func errorName(err error) string {
	return reflect.ValueOf(err).Type().Name()
}

// UserNameError is a base error for errors that deal with user names
type UserNameError struct {
	Name string
}

// UserFormatError is an error for when the name format does not match what is required
type UserFormatError UserNameError

func (e UserFormatError) Error() string {
	return fmt.Sprintf("\"%s\", is in an invalid format", e.Name)
}

// UserTakenError is an error for when a user tries to join with a name that is already taken
type UserTakenError UserNameError

func (e UserTakenError) Error() string {
	return fmt.Sprintf("\"%s\", is already taken", e.Name)
}

// BannedUserError is an error for when a user tries to join with a banned ip address
type BannedUserError struct {
	Host, Name string
	Names      []string
}

func (e BannedUserError) Error() string {
	return fmt.Sprintf("banned user tried to connect with IP %s: %s (banned with name(s) %s)", e.Host, e.Name, strings.Join(e.Names, ", "))
}

func newBannedUserError(host, name string, names []string) BannedUserError {
	return BannedUserError{
		Host:  host,
		Name:  name,
		Names: names,
	}
}
