// Package mock implements a mock connector which requires no user interaction.
package mock

import (
	"fmt"
	"net/http"
	"net/url"

	"github.com/coreos/poke/connector"
	"github.com/coreos/poke/storage"
)

// New returns a mock connector which requires no user interaction. It always returns
// the same (fake) identity.
func New() connector.Connector {
	return mockConnector{}
}

type mockConnector struct{}

func (m mockConnector) Close() error { return nil }

func (m mockConnector) LoginURL(callbackURL, state string) (string, error) {
	u, err := url.Parse(callbackURL)
	if err != nil {
		return "", fmt.Errorf("failed to parse callbackURL %q: %v", callbackURL, err)
	}
	v := u.Query()
	v.Set("state", state)
	u.RawQuery = v.Encode()
	return u.String(), nil
}

func (m mockConnector) HandleCallback(r *http.Request) (storage.Identity, string, error) {
	return storage.Identity{
		UserID:        "0-385-28089-0",
		Username:      "Kilgore Trout",
		Email:         "kilgore@kilgore.trout",
		EmailVerified: true,
	}, r.URL.Query().Get("state"), nil
}

func (m mockConnector) Groups(identity storage.Identity) ([]string, error) {
	return []string{"authors"}, nil
}

// Config holds the configuration parameters for the mock connector.
type Config struct{}

// Open returns an authentication strategy which requires no user interaction.
func (c *Config) Open() (connector.Connector, error) {
	return New(), nil
}