package lib

import (
	"bytes"
	"io"
	"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
}

type bufferCloser struct {
	bytes.Buffer
}

func (*bufferCloser) Close() error {
	return nil
}

type serializer struct {
	data      bufferCloser
	signature bufferCloser
	hasData   bool
}

func (s *serializer) DataWriter() io.WriteCloser {
	s.hasData = true
	s.data.Reset()
	return &s.data
}

func (s *serializer) SignatureWriter() io.WriteCloser {
	s.signature.Reset()
	return &s.signature
}

func (s *serializer) DataReader() io.Reader {
	if s.hasData {
		return &s.data
	}
	return nil
}

func (s *serializer) SignatureReader() io.Reader {
	if s.hasData {
		return &s.signature
	}
	return nil
}

func TestSavingAndFetchingIdentity(t *testing.T) {
	r := rt.Init()
	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"))
	if err := manager.AddOrigin("sampleapp.com", "google/user1", nil); err != nil {
		t.Fatalf("failed to generate id: %v", err)
	}

	if _, err := manager.Identity("sampleapp.com"); err != nil {
		t.Errorf("failed to get  an identity for sampleapp.com: %v", err)
	}

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

func TestAccountsMatching(t *testing.T) {
	r := rt.Init()
	topLevelName := r.Identity().PublicID().Names()[0]
	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"))
	manager.AddAccount("google/user2", createChain(r, "google/user2"))
	manager.AddAccount("facebook/user1", createChain(r, "facebook/user1"))

	result := manager.AccountsMatching(security.PrincipalPattern(topLevelName + "/google/*"))
	sort.StringSlice(result).Sort()
	expected := []string{"google/user1", "google/user2"}
	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, &serializer{})
	if err != nil {
		t.Fatalf("creating identity manager failed with: %v", err)
	}

	err = manager.AddOrigin("sampleapp.com", "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 serializer

	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"))
	if err = manager.AddOrigin("sampleapp.com", "google/user1", 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)
	}
	if _, err := newManager.Identity("sampleapp.com"); err != nil {
		t.Errorf("can't find the sampleapp.com identity: %v", err)
	}

	if err := newManager.AddOrigin("sampleapp2.com", "google/user1", nil); err != nil {
		t.Errorf("failed to create sampleapp2.com identity: %v", err)
	}
}
