package ast

import (
	"fmt"

	"gopkg.in/yaml.v3"

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

type For struct {
	From  string
	List  []any
	Var   string
	Split string
	As    string
}

func (f *For) UnmarshalYAML(node *yaml.Node) error {
	switch node.Kind {

	case yaml.ScalarNode:
		var from string
		if err := node.Decode(&from); err != nil {
			return err
		}
		f.From = from
		return nil

	case yaml.SequenceNode:
		var list []any
		if err := node.Decode(&list); err != nil {
			return err
		}
		f.List = list
		return nil

	case yaml.MappingNode:
		var forStruct struct {
			Var   string
			Split string
			As    string
		}
		if err := node.Decode(&forStruct); err == nil && forStruct.Var != "" {
			f.Var = forStruct.Var
			f.Split = forStruct.Split
			f.As = forStruct.As
			return nil
		}

		return fmt.Errorf("yaml: line %d: invalid keys in for", node.Line)
	}

	return fmt.Errorf("yaml: line %d: cannot unmarshal %s into for", node.Line, node.ShortTag())
}

func (f *For) DeepCopy() *For {
	if f == nil {
		return nil
	}
	return &For{
		From:  f.From,
		List:  deepcopy.Slice(f.List),
		Var:   f.Var,
		Split: f.Split,
		As:    f.As,
	}
}