package session

import (
	"net/http"

	"github.com/gorilla/context"
	"github.com/gorilla/securecookie"
	"github.com/gorilla/sessions"
)

type store struct {
	store sessions.Store
}

func NewStore(secure bool, maxAgeSeconds int, secrets ...string) Store {
	values := [][]byte{}
	for _, secret := range secrets {
		values = append(values, []byte(secret))
	}
	cookie := sessions.NewCookieStore(values...)
	cookie.Options.MaxAge = maxAgeSeconds
	cookie.Options.HttpOnly = true
	cookie.Options.Secure = secure
	return store{cookie}
}

func (s store) Get(req *http.Request, name string) (Session, error) {
	session, err := s.store.Get(req, name)
	if err != nil && err.Error() == securecookie.ErrMacInvalid.Error() {
		err = nil
	}
	return sessionWrapper{session}, err
}

func (s store) Save(w http.ResponseWriter, req *http.Request) error {
	return sessions.Save(req, w)
}

func (s store) Wrap(h http.Handler) http.Handler {
	return context.ClearHandler(h)
}

type sessionWrapper struct {
	session *sessions.Session
}

func (s sessionWrapper) Values() map[interface{}]interface{} {
	if s.session == nil {
		return map[interface{}]interface{}{}
	}
	return s.session.Values
}