package taskfile

import (
	"errors"
)

// Tasks represents a group of tasks
type Tasks map[string]*Task

// Task represents a task
type Task struct {
	Task          string
	Cmds          []*Cmd
	Deps          []*Dep
	Desc          string
	Summary       string
	Sources       []string
	Generates     []string
	Status        []string
	Preconditions []*Precondition
	Dir           string
	Vars          Vars
	Env           Vars
	Silent        bool
	Method        string
	Prefix        string
	IgnoreError   bool
}

var (
	// ErrCantUnmarshalTask is returned for invalid task YAML
	ErrCantUnmarshalTask = errors.New("task: can't unmarshal task value")
)

func (t *Task) UnmarshalYAML(unmarshal func(interface{}) error) error {
	var cmd Cmd
	if err := unmarshal(&cmd); err == nil && cmd.Cmd != "" {
		t.Cmds = append(t.Cmds, &cmd)
		return nil
	}

	var cmds []*Cmd
	if err := unmarshal(&cmds); err == nil && len(cmds) > 0 {
		t.Cmds = cmds
		return nil
	}

	var task struct {
		Cmds          []*Cmd
		Deps          []*Dep
		Desc          string
		Summary       string
		Sources       []string
		Generates     []string
		Status        []string
		Preconditions []*Precondition
		Dir           string
		Vars          Vars
		Env           Vars
		Silent        bool
		Method        string
		Prefix        string
		IgnoreError   bool `yaml:"ignore_error"`
	}
	if err := unmarshal(&task); err == nil {
		t.Cmds = task.Cmds
		t.Deps = task.Deps
		t.Desc = task.Desc
		t.Summary = task.Summary
		t.Sources = task.Sources
		t.Generates = task.Generates
		t.Status = task.Status
		t.Preconditions = task.Preconditions
		t.Dir = task.Dir
		t.Vars = task.Vars
		t.Env = task.Env
		t.Silent = task.Silent
		t.Method = task.Method
		t.Prefix = task.Prefix
		t.IgnoreError = task.IgnoreError

		return nil
	}

	return ErrCantUnmarshalTask
}
