package validator

import (
	"errors"
	"fmt"

	"npm/internal/entity/nginxtemplate"
	"npm/internal/entity/upstream"
)

// ValidateUpstream will check if associated objects exist and other checks
// will return  a nil error if things are OK
func ValidateUpstream(u upstream.Model) error {
	// Needs to have more than 1 server
	if len(u.Servers) < 2 {
		return errors.New("Upstreams require at least 2 servers")
	}

	// Backup servers aren't permitted with hash balancing
	if u.IPHash {
		// check all servers for a backup param
		for _, server := range u.Servers {
			if server.Backup {
				return errors.New("Backup servers cannot be used with hash balancing")
			}
		}
	}

	// Check the nginx template exists and has the same type.
	nginxTemplate, err := nginxtemplate.GetByID(u.NginxTemplateID)
	if err != nil {
		return fmt.Errorf("Nginx Template #%d does not exist", u.NginxTemplateID)
	}
	if nginxTemplate.Type != "upstream" {
		return fmt.Errorf("Host Template #%d is not valid for this upstream", u.NginxTemplateID)
	}

	return nil
}