package security

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)
	}
}
