package service

import (
	"fmt"

	baseapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
	"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
	"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
	"github.com/openshift/origin/pkg/api"
)

type ServiceRegistryStorage struct {
	registry ServiceRegistry
}

func NewRESTStorage(registry ServiceRegistry) apiserver.RESTStorage {
	return &ServiceRegistryStorage{registry}
}

func (s *ServiceRegistryStorage) New() interface{} {
	return &api.Service{}
}

func (s *ServiceRegistryStorage) Get(id string) (interface{}, error) {
	service, err := s.registry.GetService(id)
	if err != nil {
		return service, err
	}
	if service == nil {
		return service, nil
	}
	return service, err
}

func (s *ServiceRegistryStorage) List(selector labels.Selector) (interface{}, error) {
	var result api.ServiceList
	services, err := s.registry.ListServices(selector)
	if err == nil {
		result.Items = services
	}
	return result, err
}

func (s *ServiceRegistryStorage) Delete(id string) (<-chan interface{}, error) {
	return apiserver.MakeAsync(func() (interface{}, error) {
		return baseapi.Status{Status: baseapi.StatusSuccess}, s.registry.DeleteService(id)
	}), nil
}

func (s *ServiceRegistryStorage) Create(obj interface{}) (<-chan interface{}, error) {
	service := obj.(api.Service)
	if len(service.ID) == 0 {
		return nil, fmt.Errorf("id is unspecified: %#v", service)
	}

	return apiserver.MakeAsync(func() (interface{}, error) {
		if err := s.registry.CreateService(service); err != nil {
			return nil, err
		}
		return s.Get(service.ID)
	}), nil
}

func (s *ServiceRegistryStorage) Update(obj interface{}) (<-chan interface{}, error) {
	service := obj.(api.Service)
	if len(service.ID) == 0 {
		return nil, fmt.Errorf("id is unspecified: %#v", service)
	}

	return apiserver.MakeAsync(func() (interface{}, error) {
		err := s.registry.UpdateService(service)
		if err != nil {
			return nil, err
		}
		return s.Get(service.ID)
	}), nil
}