package decoders

import (
	"fmt"

	"git.max-richter.dev/max/marka/parser/utils"
	renderUtils "git.max-richter.dev/max/marka/renderer/utils"
	"git.max-richter.dev/max/marka/template"
	"go.yaml.in/yaml/v4"
)

func Yaml(input string, block template.Block) (value any, error error) {
	res := make(map[string]any)
	err := yaml.Unmarshal([]byte(input), &res)
	if err != nil {
		return nil, fmt.Errorf("failed to parse yaml '%q': %w", input, err)
	}

	var out any
	for _, f := range block.Fields {

		if f.Path == "@schema" {
			continue
		}

		if f.CodecType == template.CodecConst {
			if f.Value != nil {
				out = utils.SetPathValue(f.Path, f.Value, out)
			}
		} else {
			if value, ok := res[f.Path]; ok {
				out = utils.SetPathValue(f.Path, value, out)
				continue
			}

			if value, ok := renderUtils.GetValueFromPath(res, f.Path); ok {
				out = utils.SetPathValue(f.Path, value, out)
				continue
			}
		}
	}

	return out, nil
}
