package validation

import (
	"fmt"
	"slices"

	"github.com/tidbcloud/devops/entity/github"
	"github.com/tidbcloud/devops/entity/release"
	"github.com/tidbcloud/devops/pkg/infra/utils/container"
)

var (
	Release = releaseValidator{}
)

type releaseValidator struct{}

func (_ releaseValidator) TicketInRepo(t *release.ReleaseTicketInRepo) error {
	if t.Name == "" {
		return ErrRequired("name")
	}

	locSet := container.NewSet[github.PRLocation]()
	for _, loc := range t.GithubPRLocations {
		if locSet.Has(loc) {
			return ErrDuplicate("github_pr_locations", loc)
		}
		locSet.Insert(loc)
	}

	return nil
}

func (_ releaseValidator) ReleaseInRepo(r *release.ReleaseInRepo) error {
	if r.Name == "" {
		return ErrRequired("name")
	}
	if !slices.Contains(release.ReleaseTypeValues, r.Type) {
		return ErrInvalid("type", r.Type)
	}
	if r.WindowStartAt.After(r.WindowEndAt) {
		return fmt.Errorf("window start time must before window end time")
	}
	if !slices.Contains(release.ReleaseStatusValues, r.Status) {
		return ErrInvalid("status", r.Status)
	}

	return nil
}
