// Copyright 2019 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 file.

package frontend

import (
	"context"
	"testing"

	"github.com/alicebob/miniredis/v2"
	"github.com/go-redis/redis/v7"
	"github.com/google/go-cmp/cmp"
	"golang.org/x/pkgsite/internal/complete"
)

func TestAutoCompletion(t *testing.T) {
	s, err := miniredis.Run()
	if err != nil {
		t.Fatal(err)
	}
	defer s.Close()
	r := redis.NewClient(&redis.Options{Addr: s.Addr()})
	// For convenence, populate completion data based on detail path -> imports.
	pathData := map[string]int{
		"foo.com/bar@v1.2.3/baz":          123,
		"foo.com/quux@v1.0.0/bark":        10,
		"github.com/something@v2.0.0/foo": 80,
	}
	for k, v := range pathData {
		pkgPath, modPath, version, err := parseDetailsURLPath(k)
		if err != nil {
			t.Fatal(err)
		}
		partial := complete.Completion{
			PackagePath: pkgPath,
			ModulePath:  modPath,
			Version:     version,
			Importers:   v,
		}
		completions := complete.PathCompletions(partial)
		var zs []*redis.Z
		for _, cmpl := range completions {
			zs = append(zs, &redis.Z{Member: cmpl.Encode()})
		}
		if v > 0 {
			r.ZAdd(complete.PopularKey, zs...)
		} else {
			r.ZAdd(complete.RemainingKey, zs...)
		}
	}
	ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
	defer cancel()

	tests := []struct {
		q    string
		want []string
	}{
		{"baz", []string{"foo.com/bar/baz"}},
		{"bar", []string{"foo.com/bar/baz", "foo.com/quux/bark"}},
		{"foo", []string{"github.com/something/foo", "foo.com/bar/baz"}},
	}
	for _, test := range tests {
		t.Run(test.q, func(t *testing.T) {
			results, err := doCompletion(ctx, r, test.q, 2)
			if err != nil {
				t.Fatal(err)
			}
			var got []string
			for _, res := range results {
				got = append(got, res.PackagePath)
			}
			if diff := cmp.Diff(test.want, got); diff != "" {
				t.Errorf("doCompletion(%q) mismatch (-want +got)\n%s", test.q, diff)
			}
		})
	}
}

func TestNextPrefix(t *testing.T) {
	tests := []struct {
		prefix, want string
	}{
		{"", ""},
		{"~~~", ""},
		{"aa", "ab"},
		{"aB", "aC"},
		{"a~", "b"},
	}
	for _, test := range tests {
		if got := nextPrefix(test.prefix); got != test.want {
			t.Errorf("nextPrefix(%q) = %q, want %q", test.prefix, got, test.want)
		}
	}
}
