package steps

import (
	"context"
	"fmt"

	"github.com/pingcap/errors"
)

type assertString struct {
	actual *string
	expect *string
	equal  bool
}

func (c *assertString) String() string {
	var equal string
	if c.equal {
		equal = "equal"
	} else {
		equal = "unequal"
	}
	return fmt.Sprintf("Assert String %s, actual : %s,  expect : %s", equal, *c.actual, *c.expect)
}

func (c *assertString) Execute(ctx context.Context) error {
	if *c.expect != *c.actual && c.equal {
		return errors.Errorf("assert string equal failed, actual: %s, expect: %s",
			*c.actual, *c.expect)
	} else {
		if *c.expect == *c.actual && !c.equal {
			return errors.Errorf("assert string unequal failed, actual: %s, expect: %s",
				*c.actual, *c.expect)
		}
	}
	return nil
}

func AssertString(actual *string, expect *string, equal bool) *assertString {
	return &assertString{
		actual,
		expect,
		equal,
	}
}

func (b *Builder) AssertString(actual *string, expect *string, equal bool) *Builder {
	b.steps = append(b.steps, AssertString(actual, expect, equal))
	return b
}
