package errors

import (
	"path/filepath"
)

// GenerationError is an error returned from config generators
type GenerationError int

const (
	NoGit GenerationError = iota + 1
	SourceDirAndURL
	InvalidSourceDir
	CouldNotDetect
	NoBuilderFound
	InvalidDockerfile
	ImageNotFound
)

func (e GenerationError) Error() string {
	switch e {
	case NoGit:
		return "git was not detected in your system. It is needed for build config generation."
	case SourceDirAndURL:
		return "a source directory and a source URL were specified. Please only specify one."
	case InvalidSourceDir:
		return "the source directory is not readable or is invalid."
	case CouldNotDetect:
		return "could not detect a build type from the source."
	case NoBuilderFound:
		return "could not find a builder to match the source-to-image source repository."
	case InvalidDockerfile:
		return "invalid Dockerfile. Does not contain a FROM clause."
	case ImageNotFound:
		return "image data could not be found."
	}
	return ""
}

// MultipleDockerfiles creates an error caused by multiple Dockerfiles existing in a repository
func NewMultipleDockerfilesErr(paths []string) error {
	err := multipleDockerFilesError{}
	err = append(err, paths...)
	return err
}

type multipleDockerFilesError []string

func (e multipleDockerFilesError) Error() string {
	result := "multiple Dockerfile(s) found.\nSpecify one of the following flags:\n"
	for _, f := range e {
		dir := filepath.Dir(f)
		if dir == "" {
			dir = "."
		}
		result += "--docker-context=\"" + dir + "\""
		result += "\n"
	}
	return result
}