// Copyright 2017, The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE.md file.

package cmp

import (
	"fmt"
	"reflect"
	"strings"

	"github.com/google/go-cmp/cmp/internal/value"
)

type defaultReporter struct {
	path   Path     // The current path
	diffs  []string // List of differences, possibly truncated
	ndiffs int      // Total number of differences
	nbytes int      // Number of bytes in diffs
	nlines int      // Number of lines in diffs
}

func (r *defaultReporter) PushStep(ps PathStep) { r.path.push(ps) }
func (r *defaultReporter) PopStep()             { r.path.pop() }

func (r *defaultReporter) Report(x, y reflect.Value, eq bool) {
	if eq {
		return // Ignore equal results
	}
	const maxBytes = 4096
	const maxLines = 256
	r.ndiffs++
	if r.nbytes < maxBytes && r.nlines < maxLines {
		sx := value.Format(x, true)
		sy := value.Format(y, true)
		if sx == sy {
			// Stringer is not helpful, so rely on more exact formatting.
			sx = value.Format(x, false)
			sy = value.Format(y, false)
		}
		s := fmt.Sprintf("%#v:\n\t-: %s\n\t+: %s\n", r.path, sx, sy)
		r.diffs = append(r.diffs, s)
		r.nbytes += len(s)
		r.nlines += strings.Count(s, "\n")
	}
}

func (r *defaultReporter) String() string {
	s := strings.Join(r.diffs, "")
	if r.ndiffs == len(r.diffs) {
		return s
	}
	return fmt.Sprintf("%s... %d more differences ...", s, r.ndiffs-len(r.diffs))
}
