package arn

import (
	"github.com/aerogo/aero"
	"github.com/aerogo/api"
)

// Joinable is an object where users can join and leave.
type Joinable interface {
	Join(*User) error
	Leave(*User) error
	Save()
}

// JoinAction returns an API action that lets the user join the object.
func JoinAction() *api.Action {
	return &api.Action{
		Name:  "join",
		Route: "/join",
		Run: func(obj interface{}, ctx aero.Context) error {
			user := GetUserFromContext(ctx)
			joinable := obj.(Joinable)
			err := joinable.Join(user)

			if err != nil {
				return err
			}

			joinable.Save()
			return nil
		},
	}
}

// LeaveAction returns an API action that unpublishes the object.
func LeaveAction() *api.Action {
	return &api.Action{
		Name:  "leave",
		Route: "/leave",
		Run: func(obj interface{}, ctx aero.Context) error {
			user := GetUserFromContext(ctx)
			joinable := obj.(Joinable)
			err := joinable.Leave(user)

			if err != nil {
				return err
			}

			joinable.Save()
			return nil
		},
	}
}