package mock

import (
	"fmt"
	"net"
	"net/http"
	"sync"
	"encoding/json"
	"time"
	"github.com/julienschmidt/httprouter"
	"github.com/apid/istioApigeeAdapter/common"
)

var mockInit = &sync.Once{}

type MockServer struct {
	listener net.Listener
}

func StartMockServer(port int) (*MockServer, error) {
	mockInit.Do(makeKeys)

	l, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
	if err != nil {
		return nil, err
	}

	ms := &MockServer{
		listener: l,
	}

  router := httprouter.New()
	router.GET("/publicKey", ms.getPublicKey)
	router.GET("/products", ms.getProducts)

	go func() {
		http.Serve(l, router)
	}()

	return ms, nil
}

func (m *MockServer) Address() string {
	return m.listener.Addr().String()
}

func (m *MockServer) Stop() {
	m.listener.Close()
}

func (m *MockServer) getPublicKey(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
	w.Header().Set("content-type", "text/plain")
	w.Write(mockCertPEM)
}

func (m *MockServer) getProducts(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
	now := time.Now()
	p := []common.APIProduct{
		{
			Name: "First",
			DisplayName: "First Product",
			Description: "First test product",
			CreatedAt: now.UnixNano(),
			CreatedBy: "foo@bar.com",
			LastModifiedAt: now.UnixNano(),
			LastModifiedBy: "foo@bar.com",

			APIResources: []string{"/**"},
			ApprovalType: "auto",
			Attributes: []common.Attribute{
				{
					Name: "access",
					Value: "public",
				},
			},
			Environments: []string{"test", "prod"},
			Proxies: []string{"ProxyOne"},
			Quota: "10",
			QuotaInterval: "1",
			QuotaTimeUnit: "minute",
		},
	}

	w.Header().Set("content-type", "application/json")

	enc := json.NewEncoder(w)
	enc.Encode(p)
}