// Copyright 2020-2023 Project Capsule Authors.
// SPDX-License-Identifier: Apache-2.0

package service

import (
	"fmt"
	"strings"

	"github.com/projectcapsule/capsule/pkg/api"
)

type externalServiceIPForbiddenError struct {
	cidr []string
}

func NewExternalServiceIPForbidden(allowedIps []api.AllowedIP) error {
	cidr := make([]string, 0, len(allowedIps))

	for _, i := range allowedIps {
		cidr = append(cidr, string(i))
	}

	return &externalServiceIPForbiddenError{
		cidr: cidr,
	}
}

func (e externalServiceIPForbiddenError) Error() string {
	if len(e.cidr) == 0 {
		return "The current Tenant does not allow the use of Service with external IPs"
	}

	return fmt.Sprintf("The selected external IPs for the current Service are violating the following enforced CIDRs: %s", strings.Join(e.cidr, ", "))
}

type nodePortDisabledError struct{}

func NewNodePortDisabledError() error {
	return &nodePortDisabledError{}
}

func (nodePortDisabledError) Error() string {
	return "NodePort service types are forbidden for the tenant: please, reach out to the system administrators"
}

type externalNameDisabledError struct{}

func NewExternalNameDisabledError() error {
	return &externalNameDisabledError{}
}

func (externalNameDisabledError) Error() string {
	return "ExternalName service types are forbidden for the tenant: please, reach out to the system administrators"
}

type loadBalancerDisabledError struct{}

func NewLoadBalancerDisabled() error {
	return &loadBalancerDisabledError{}
}

func (loadBalancerDisabledError) Error() string {
	return "LoadBalancer service types are forbidden for the tenant: please, reach out to the system administrators"
}
