package pnet

import (
	"bytes"
	"encoding/base64"
	"testing"
)

func bufWithBase(base string, windows bool) *bytes.Buffer {
	b := &bytes.Buffer{}
	b.Write(pathPSKv1)
	if windows {
		b.WriteString("\r")
	}
	b.WriteString("\n")
	b.WriteString(base)
	if windows {
		b.WriteString("\r")
	}
	b.WriteString("\n")
	return b
}

func TestDecodeHex(t *testing.T) {
	testDecodeHex(t, true)
	testDecodeHex(t, false)
}

func TestDecodeBad(t *testing.T) {
	testDecodeBad(t, true)
	testDecodeBad(t, false)
}

func testDecodeBad(t *testing.T, windows bool) {
	b := bufWithBase("/verybadbase/", windows)
	b.WriteString("Have fun decoding that key")

	_, err := DecodeV1PSK(b)
	if err == nil {
		t.Fatal("expected 'unknown encoding' got nil")
	}
}

func testDecodeHex(t *testing.T, windows bool) {
	b := bufWithBase("/base16/", windows)
	for i := 0; i < 32; i++ {
		b.WriteString("FF")
	}

	psk, err := DecodeV1PSK(b)
	if err != nil {
		t.Fatal(err)
	}

	for _, b := range psk {
		if b != 255 {
			t.Fatal("byte was wrong")
		}
	}
}

func TestDecodeB64(t *testing.T) {
	testDecodeB64(t, true)
	testDecodeB64(t, false)
}

func testDecodeB64(t *testing.T, windows bool) {
	b := bufWithBase("/base64/", windows)
	key := make([]byte, 32)
	for i := 0; i < 32; i++ {
		key[i] = byte(i)
	}

	e := base64.NewEncoder(base64.StdEncoding, b)
	_, err := e.Write(key)
	if err != nil {
		t.Fatal(err)
	}
	err = e.Close()
	if err != nil {
		t.Fatal(err)
	}

	psk, err := DecodeV1PSK(b)
	if err != nil {
		t.Fatal(err)
	}

	for i, b := range psk {
		if b != psk[i] {
			t.Fatal("byte was wrong")
		}
	}

}

func TestDecodeBin(t *testing.T) {
	testDecodeBin(t, true)
	testDecodeBin(t, false)
}

func testDecodeBin(t *testing.T, windows bool) {
	b := bufWithBase("/bin/", windows)
	key := make([]byte, 32)
	for i := 0; i < 32; i++ {
		key[i] = byte(i)
	}

	b.Write(key)

	psk, err := DecodeV1PSK(b)
	if err != nil {
		t.Fatal(err)
	}

	for i, b := range psk {
		if b != psk[i] {
			t.Fatal("byte was wrong")
		}
	}

}