package database

import (
	"io"
	"time"

	proto "git.xeserv.us/xena/route/proto"
	"github.com/Xe/ln"
	"golang.org/x/net/context"
)

// Routes is the set of API calls needed to manage Route resources.
//
// Database backends should implement this interface.
type Routes interface {
	io.Closer

	Get(ctx context.Context, id string) (Route, error)
	GetHost(ctx context.Context, host string) (Route, error)
	GetAll(ctx context.Context, user string) ([]Route, error)
	Put(ctx context.Context, r Route) (Route, error)
	Delete(ctx context.Context, r Route) (Route, error)
}

// Route is a single HTTP route.
type Route struct {
	ID       string `storm:"id"`
	Creator  string
	Hostname string `storm:"unique"`

	CreatedAt time.Time
	EditedAt  time.Time
	Active    bool
}

// F https://godoc.org/github.com/Xe/ln#F
func (r Route) F() ln.F {
	return ln.F{
		"route-id":       r.ID,
		"route-creator":  r.Creator,
		"route-hostname": r.Hostname,
	}
}

func (r *Route) Scan(row Scanner) error {
	return row.Scan(&r.ID, &r.Creator, &r.Hostname, &r.CreatedAt, &r.EditedAt, &r.Active)
}

// AsProto converts this into a protobuf Route.
func (r Route) AsProto() *proto.Route {
	return &proto.Route{
		Id:      r.ID,
		Creator: r.Creator,
		Host:    r.Hostname,
	}
}
