package danglingwhitespace

import (
	"bytes"
	"fmt"

	"github.com/vbatts/git-validation/git"
	"github.com/vbatts/git-validation/validate"
)

var (
	// DanglingWhitespace is the rule for checking the presence of dangling
	// whitespaces on line endings.
	DanglingWhitespace = validate.Rule{
		Name:        "dangling-whitespace",
		Description: "checking the presence of dangling whitespaces on line endings",
		Run:         ValidateDanglingWhitespace,
	}
)

func init() {
	validate.RegisterRule(DanglingWhitespace)
}

func ValidateDanglingWhitespace(c git.CommitEntry) (vr validate.Result) {
	diff, err := git.Show(c["commit"])
	if err != nil {
		return validate.Result{Pass: false, Msg: err.Error(), CommitEntry: c}
	}

	vr.CommitEntry = c
	vr.Pass = true
	for _, line := range bytes.Split(diff, newLine) {
		if !bytes.HasPrefix(line, diffAddLine) || bytes.Equal(line, diffAddLine) {
			continue
		}
		if len(bytes.TrimSpace(line)) != len(line) {
			vr.Pass = false
			vr.Msg = fmt.Sprintf("line %q has trailiing spaces", string(line))
		}
	}
	vr.Msg = "all added diff lines do not have trailing spaces"
	return
}

var (
	newLine     = []byte("\n")
	diffAddLine = []byte("+ ")
)