package internal

import (
	"fmt"
	"strings"

	"coopcloud.tech/abra/pkg/recipe"
	"github.com/AlecAivazis/survey/v2"
	"github.com/docker/distribution/reference"
	"github.com/sirupsen/logrus"
)

// PromptBumpType prompts for version bump type
func PromptBumpType(tagString string) error {
	if (!Major && !Minor && !Patch) && tagString == "" {
		fmt.Printf(`semver cheat sheet (more via semver.org):
  major: new features/bug fixes, backwards incompatible
  minor: new features/bug fixes, backwards compatible
  patch: bug fixes, backwards compatible
`)

		var chosenBumpType string
		prompt := &survey.Select{
			Message: fmt.Sprintf("select recipe version increment type"),
			Options: []string{"major", "minor", "patch"},
		}

		if err := survey.AskOne(prompt, &chosenBumpType); err != nil {
			return err
		}

		SetBumpType(chosenBumpType)
	}

	return nil
}

// GetBumpType figures out which bump type is specified
func GetBumpType() string {
	var bumpType string

	if Major {
		bumpType = "major"
	} else if Minor {
		bumpType = "minor"
	} else if Patch {
		bumpType = "patch"
	} else {
		logrus.Fatal("no version bump type specififed?")
	}

	return bumpType
}

// SetBumpType figures out which bump type is specified
func SetBumpType(bumpType string) {
	if bumpType == "major" {
		Major = true
	} else if bumpType == "minor" {
		Minor = true
	} else if bumpType == "patch" {
		Patch = true
	} else {
		logrus.Fatal("no version bump type specififed?")
	}
}

// GetMainAppImage retrieves the main 'app' image name
func GetMainAppImage(recipe recipe.Recipe) (string, error) {
	var path string

	for _, service := range recipe.Config.Services {
		if service.Name == "app" {
			img, err := reference.ParseNormalizedNamed(service.Image)
			if err != nil {
				return "", err
			}

			path = reference.Path(img)
			if strings.Contains(path, "library") {
				path = strings.Split(path, "/")[1]
			}

			return path, nil
		}
	}

	if path == "" {
		return path, fmt.Errorf("%s has no main 'app' service?", recipe.Name)
	}

	return path, nil
}