// Copyright 2016 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// +build linux

package pretty

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"syscall"
)

// Diff compares the pretty-printed representation of two values. The second
// return value reports whether the two values' representations are identical.
// If it is false, the first return value contains the diffs.
//
// The output labels the first value "want" and the second "got".
//
// Diff works by invoking the "diff" command. It will only succeed in
// environments where "diff" is on the shell path.
func Diff(want, got interface{}) (string, bool, error) {
	fname1, err := writeToTemp(want)
	if err != nil {
		return "", false, err
	}
	defer os.Remove(fname1)

	fname2, err := writeToTemp(got)
	if err != nil {
		return "", false, err
	}
	defer os.Remove(fname2)

	cmd := exec.Command("diff", "-u", "--label=want", "--label=got", fname1, fname2)
	out, err := cmd.Output()
	if err == nil {
		return string(out), true, nil
	}
	eerr, ok := err.(*exec.ExitError)
	if !ok {
		return "", false, err
	}
	ws, ok := eerr.Sys().(syscall.WaitStatus)
	if !ok {
		return "", false, err
	}
	if ws.ExitStatus() != 1 {
		return "", false, err
	}
	// Exit status of 1 means no error, but diffs were found.
	return string(out), false, nil
}

func writeToTemp(v interface{}) (string, error) {
	f, err := ioutil.TempFile("", "prettyDiff")
	if err != nil {
		return "", err
	}
	if _, err := fmt.Fprintf(f, "%+v\n", Value(v)); err != nil {
		return "", err
	}
	if err := f.Close(); err != nil {
		return "", err
	}
	return f.Name(), nil
}
