package state

import (
	"fmt"
)

type State interface {
	executeState(c *Context)
}

type Context struct {
	StepIndex int
	StepName  string
	Current   State
}

type StartState struct{}

func (s *StartState) executeState(c *Context) {
	c.StepIndex = 1
	c.StepName = "start"
	c.Current = &StartState{}
}

type InprogressState struct{}

func (s *InprogressState) executeState(c *Context) {
	c.StepIndex = 2
	c.StepName = "inprogress"
	c.Current = &InprogressState{}
}

type StopState struct{}

func (s *StopState) executeState(c *Context) {
	c.StepIndex = 3
	c.StepName = "stop"
	c.Current = &StopState{}
}

func StateDemo() {
	context := &Context{}

	startState := &StartState{}
	startState.executeState(context)
	fmt.Println("state: ", context)

	inprState := &InprogressState{}
	inprState.executeState(context)
	fmt.Println("state: ", context)

	stopState := &StopState{}
	stopState.executeState(context)
	fmt.Println("state: ", context)
}