/*
Copyright (c) Edgeless Systems GmbH

SPDX-License-Identifier: AGPL-3.0-only
*/

package helm

import (
	"fmt"
	"strings"

	"github.com/edgelesssys/constellation/v2/internal/semver"
)

// ServiceVersions bundles the versions of all services that are part of Constellation.
type ServiceVersions struct {
	cilium                 semver.Semver
	certManager            semver.Semver
	constellationOperators semver.Semver
	constellationServices  semver.Semver
	awsLBController        semver.Semver
	csiVersions            map[string]semver.Semver
}

// String returns a string representation of the ServiceVersions struct.
func (s ServiceVersions) String() string {
	builder := strings.Builder{}
	builder.WriteString("Service versions:\n")
	builder.WriteString(fmt.Sprintf("\tCilium: %s\n", s.cilium))
	builder.WriteString(fmt.Sprintf("\tcert-manager: %s\n", s.certManager))
	builder.WriteString(fmt.Sprintf("\tconstellation-operators: %s\n", s.constellationOperators))
	builder.WriteString(fmt.Sprintf("\tconstellation-services: %s\n", s.constellationServices))

	if s.awsLBController != (semver.Semver{}) {
		builder.WriteString(fmt.Sprintf("\taws-load-balancer-controller: %s\n", s.awsLBController))
	}

	builder.WriteString("\tCSI:")
	if len(s.csiVersions) != 0 {
		builder.WriteString("\n")
		for name, csiVersion := range s.csiVersions {
			builder.WriteString(fmt.Sprintf("\t\t%s: %s\n", name, csiVersion))
		}
	} else {
		builder.WriteString(" not installed\n")
	}

	return builder.String()
}

// ConstellationServices returns the version of the constellation-services release.
func (s ServiceVersions) ConstellationServices() semver.Semver {
	return s.constellationServices
}