package identity

import (
	"net/url"
	"reflect"
	"sort"
	"strings"
	"testing"
	"time"

	"veyron2"
	"veyron2/rt"
	"veyron2/security"
)

func createChain(r veyron2.Runtime, name string) security.PrivateID {
	id := r.Identity()

	for _, component := range strings.Split(name, "/") {
		newID, err := r.NewIdentity(component)
		if err != nil {
			panic(err)
		}
		if id == nil {
			id = newID
			continue
		}
		blessedID, err := id.Bless(newID.PublicID(), component, time.Hour, nil)
		if err != nil {
			panic(err)
		}
		id, err = newID.Derive(blessedID)
		if err != nil {
			panic(err)
		}
	}
	return id
}

func TestSavingAndFetchingIdentity(t *testing.T) {
	r := rt.Init()
	manager, err := NewIDManager(r, &InMemorySerializer{})
	if err != nil {
		t.Fatalf("creating identity manager failed with: %v", err)
	}
	origin := "http://sampleapp.com:80"
	account := "google/user1"
	manager.AddAccount(account, createChain(r, account))
	if err := manager.AddOrigin(origin, account, nil); err != nil {
		t.Fatalf("failed to generate id: %v", err)
	}

	id, err := manager.Identity(origin)
	if err != nil {
		t.Errorf("failed to get an identity for %v: %v", origin, err)
	}
	want := []string{createChain(r, account).PublicID().Names()[0] + "/" + url.QueryEscape(origin)}
	if got := id.PublicID().Names(); !reflect.DeepEqual(got, want) {
		t.Errorf("unexpected identity name. got: %v, wanted: %v", got, want)
	}

	unknownOrigin := "http://unknown.com:80"
	if _, err := manager.Identity(unknownOrigin); err != OriginDoesNotExist {
		t.Error("should not have found an identity for %v", unknownOrigin)
	}
}

func TestAccountsMatching(t *testing.T) {
	r := rt.Init()
	topLevelName := r.Identity().PublicID().Names()[0]
	manager, err := NewIDManager(r, &InMemorySerializer{})
	if err != nil {
		t.Fatalf("creating identity manager failed with: %v", err)
	}
	googleAccount1 := "google/user1"
	googleAccount2 := "google/user2"
	facebookAccount := "facebook/user1"
	manager.AddAccount(googleAccount1, createChain(r, googleAccount1))
	manager.AddAccount(googleAccount2, createChain(r, googleAccount2))
	manager.AddAccount(facebookAccount, createChain(r, facebookAccount))

	result := manager.AccountsMatching(security.BlessingPattern(topLevelName + "/google/*"))
	sort.StringSlice(result).Sort()
	expected := []string{googleAccount1, googleAccount2}
	if !reflect.DeepEqual(result, expected) {
		t.Errorf("unexpected result from AccountsMatching, expected :%v, got: %v", expected, result)
	}
}

func TestGenerateIDWithUnknownBlesser(t *testing.T) {
	r := rt.Init()
	manager, err := NewIDManager(r, &InMemorySerializer{})
	if err != nil {
		t.Fatalf("creating identity manager failed with: %v", err)
	}

	err = manager.AddOrigin("http://sampleapp.com:80", "google/user1", nil)

	if err == nil {
		t.Errorf("should have failed to generated an id blessed by google/user1")
	}
}

func TestSerializingAndDeserializing(t *testing.T) {
	r := rt.Init()
	var serializer InMemorySerializer

	manager, err := NewIDManager(r, &serializer)
	if err != nil {
		t.Fatalf("creating identity manager failed with: %v", err)
	}
	manager.AddAccount("google/user1", createChain(r, "google/user1"))
	origin1 := "https://sampleapp-1.com:443"
	account := "google/user1"
	if err = manager.AddOrigin(origin1, account, nil); err != nil {
		t.Fatalf("failed to generate id: %v", err)
	}

	newManager, err := NewIDManager(r, &serializer)

	if err != nil {
		t.Fatalf("failed to deserialize data: %v", err)
	}
	id, err := newManager.Identity(origin1)
	if err != nil {
		t.Errorf("can't find the %v identity: %v", origin1, err)
	}
	want := []string{createChain(r, account).PublicID().Names()[0] + "/" + url.QueryEscape(origin1)}
	if got := id.PublicID().Names(); !reflect.DeepEqual(got, want) {
		t.Errorf("unexpected identity name. got: %v, wanted: %v", got, want)
	}

	origin2 := "https://sampleapp-2.com:443"
	if err := newManager.AddOrigin(origin2, account, nil); err != nil {
		t.Errorf("can't find the %v identity: %v", origin2, err)
	}
}
