package ast

import (
	"gopkg.in/yaml.v3"

	"github.com/go-task/task/v3/errors"
	"github.com/go-task/task/v3/internal/deepcopy"
)

// Requires represents a set of required variables necessary for a task to run
type Requires struct {
	Vars []*VarsWithValidation
}

func (r *Requires) DeepCopy() *Requires {
	if r == nil {
		return nil
	}

	return &Requires{
		Vars: deepcopy.Slice(r.Vars),
	}
}

type VarsWithValidation struct {
	Name string
	Enum []string
}

func (v *VarsWithValidation) DeepCopy() *VarsWithValidation {
	if v == nil {
		return nil
	}
	return &VarsWithValidation{
		Name: v.Name,
		Enum: v.Enum,
	}
}

// UnmarshalYAML implements yaml.Unmarshaler interface.
func (v *VarsWithValidation) UnmarshalYAML(node *yaml.Node) error {
	switch node.Kind {

	case yaml.ScalarNode:
		var cmd string
		if err := node.Decode(&cmd); err != nil {
			return errors.NewTaskfileDecodeError(err, node)
		}
		v.Name = cmd
		v.Enum = nil
		return nil

	case yaml.MappingNode:
		var vv struct {
			Name string
			Enum []string
		}
		if err := node.Decode(&vv); err != nil {
			return errors.NewTaskfileDecodeError(err, node)
		}
		v.Name = vv.Name
		v.Enum = vv.Enum
		return nil
	}

	return errors.NewTaskfileDecodeError(nil, node).WithTypeMessage("requires")
}