package validation

import (
	"net/url"

	errs "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
	"github.com/openshift/origin/pkg/build/api"
)

// ValidateBuild tests required fields for a Build.
func ValidateBuild(build *api.Build) errs.ErrorList {
	allErrs := errs.ErrorList{}
	if len(build.ID) == 0 {
		allErrs = append(allErrs, errs.NewFieldRequired("id", build.ID))
	}
	allErrs = append(allErrs, validateBuildInput(&build.Input).Prefix("input")...)
	return allErrs
}

// ValidateBuildConfig tests required fields for a Build.
func ValidateBuildConfig(config *api.BuildConfig) errs.ErrorList {
	allErrs := errs.ErrorList{}
	if len(config.ID) == 0 {
		allErrs = append(allErrs, errs.NewFieldRequired("id", config.ID))
	}
	allErrs = append(allErrs, validateBuildInput(&config.DesiredInput).Prefix("desiredInput")...)
	return allErrs
}

func validateBuildInput(input *api.BuildInput) errs.ErrorList {
	allErrs := errs.ErrorList{}
	if len(input.SourceURI) == 0 {
		allErrs = append(allErrs, errs.NewFieldRequired("sourceURI", input.SourceURI))
	} else if !isValidURL(input.SourceURI) {
		allErrs = append(allErrs, errs.NewFieldInvalid("sourceURI", input.SourceURI))
	}
	if len(input.ImageTag) == 0 {
		allErrs = append(allErrs, errs.NewFieldRequired("imageTag", input.ImageTag))
	}
	if input.STIInput != nil {
		allErrs = append(allErrs, validateSTIBuild(input.STIInput).Prefix("stiBuild")...)
	}
	return allErrs
}

func validateSTIBuild(sti *api.STIBuildInput) errs.ErrorList {
	allErrs := errs.ErrorList{}
	if len(sti.BuilderImage) == 0 {
		allErrs = append(allErrs, errs.NewFieldRequired("builderImage", sti.BuilderImage))
	}
	return allErrs
}

func isValidURL(uri string) bool {
	_, err := url.Parse(uri)
	return err == nil
}