// ReplacePlaceholders generated a config file using the base config file for appname by replacing the possible placeholders
// that the config fiel might have given a group of labels. These labels are used to retrieve the placeholders stored values
func ReplacePlaceholders(s storage.Storage) func(c *gin.Context) {
	return func(c *gin.Context) {
		name := c.Param("appname")
		labels := c.DefaultQuery("labels", "default")
		renderType := c.Param("format")

		list := make(map[string]*common.Placeholder)

		myViper, err := readTemplate(name)
		if err != nil {
			c.String(http.StatusNotFound, "")
		} else {
			properties := placeholders.GetPlaceHolders(myViper)
			for _, v := range properties.Placeholders {
				list[v.PlaceHolder] = v
			}

			lbls := strings.Split(labels, ",")
			// MERGE values of different labels, last overrides current value
			for _, label := range lbls {
				l := s.GetOptions(name, label)
				for k, v := range l {
					if list[k] != nil {
						list[k].PropertyValue = v
					}
				}
			}

			template := replaceTemplatePlaceHolders(myViper, list)

			b := []byte(template)
			var err error

			if renderType == "original" {
			} else {

				extension := getFileExtension(myViper)

				replacedViper := viper.New()
				replacedViper.SetConfigType(extension)
				replacedViper.ReadConfig(bytes.NewBuffer([]byte(template)))

				b, err = render(replacedViper, renderType)
			}

			if err == nil {
				c.Data(http.StatusOK, "text/plain", b)
			}

			if err != nil {
				c.String(http.StatusInternalServerError, "Could not render %s", err)

				// FALLBACK, instead of an error render only the placeholders
				//b, err = json.MarshalIndent(list, "", "    ")
				//c.Data(http.StatusOK, "text/json", b)
			}
		}

	}
}
// GetValues return the placeholders values for a given appname and concrete namespace represented as labels.
// If no labels are provided the "default" label is used
func GetValues(s storage.Storage) func(c *gin.Context) {
	return func(c *gin.Context) {
		name := c.Param("appname")
		labels := c.DefaultQuery("labels", "default")

		list := make(map[string]string)
		if strings.Contains(labels, ",") {
			lbls := strings.Split(labels, ",")
			// MERGE values of different labels, last overrides current value
			for _, label := range lbls {
				l := s.GetOptions(name, label)
				for k, v := range l {
					list[k] = v
				}
			}
		} else {
			list = s.GetOptions(name, labels)
		}

		vs := placeholders.CreateValues(list)

		c.IndentedJSON(http.StatusOK, vs)
	}
}