// 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 teststructs

import (
	"sync"

	pb "github.com/google/go-cmp/cmp/internal/testprotos"
)

// This is an sanitized example of equality from a real use-case.
// The original equality function was as follows:
/*
func equalDirt(x, y *Dirt) bool {
	if !reflect.DeepEqual(x.table, y.table) ||
		!reflect.DeepEqual(x.ts, y.ts) ||
		x.Discord != y.Discord ||
		!pb.Equal(&x.Proto, &y.Proto) ||
		len(x.wizard) != len(y.wizard) ||
		len(x.sadistic) != len(y.sadistic) ||
		x.lastTime != y.lastTime {
		return false
	}
	for k, vx := range x.wizard {
		vy, ok := y.wizard[k]
		if !ok || !pb.Equal(vx, vy) {
			return false
		}
	}
	for k, vx := range x.sadistic {
		vy, ok := y.sadistic[k]
		if !ok || !pb.Equal(vx, vy) {
			return false
		}
	}
	return true
}
*/

type Dirt struct {
	table    Table // Always concrete type of MockTable
	ts       Timestamp
	Discord  DiscordState
	Proto    pb.Dirt
	wizard   map[string]*pb.Wizard
	sadistic map[string]*pb.Sadistic
	lastTime int64
	mu       sync.Mutex
}

type DiscordState int

type Timestamp int64

func (d *Dirt) SetTable(t Table)                      { d.table = t }
func (d *Dirt) SetTimestamp(t Timestamp)              { d.ts = t }
func (d *Dirt) SetWizard(m map[string]*pb.Wizard)     { d.wizard = m }
func (d *Dirt) SetSadistic(m map[string]*pb.Sadistic) { d.sadistic = m }
func (d *Dirt) SetLastTime(t int64)                   { d.lastTime = t }

type Table interface {
	Operation1() error
	Operation2() error
	Operation3() error
}

type MockTable struct {
	state []string
}

func CreateMockTable(s []string) *MockTable { return &MockTable{s} }
func (mt *MockTable) Operation1() error     { return nil }
func (mt *MockTable) Operation2() error     { return nil }
func (mt *MockTable) Operation3() error     { return nil }
func (mt *MockTable) State() []string       { return mt.state }
