package entity

import (
	"strings"

	"github.com/pingcap/tiflow/dm/pkg/checker"
)

type PremiumCheckResultSummary struct {
	Desc         string
	State        checker.State
	Reasons      []string
	Instructions []string
}

func (i *PremiumDMPrecheckItem) SummarizeResults() (*PremiumCheckResultSummary, bool) {
	if i == nil || len(i.Results.Results) == 0 || i.Results.Results[0] == nil {
		return nil, false
	}

	first := i.Results.Results[0]
	summary := &PremiumCheckResultSummary{
		Desc:         first.Desc,
		State:        first.State,
		Reasons:      make([]string, 0),
		Instructions: make([]string, 0),
	}

	appendErrors := func(errors []*checker.Error) {
		for _, err := range errors {
			if err != nil && err.ShortErr != "" {
				summary.Reasons = append(summary.Reasons, err.ShortErr)
			}
		}
	}
	appendInstruction := func(instruction string) {
		if strings.TrimSpace(instruction) != "" {
			summary.Instructions = append(summary.Instructions, strings.TrimSpace(instruction))
		}
	}

	appendErrors(first.Errors)
	appendInstruction(first.Instruction)

	for idx := 1; idx < len(i.Results.Results); idx++ {
		result := i.Results.Results[idx]
		if result == nil {
			continue
		}

		switch result.State {
		case checker.StateFailure:
			summary.State = checker.StateFailure
		case checker.StateWarning:
			if summary.State != checker.StateFailure {
				summary.State = checker.StateWarning
			}
		case checker.StateSuccess:
		}

		appendErrors(result.Errors)
		appendInstruction(result.Instruction)
	}

	return summary, true
}
