/*
 * Dash API
 *
 * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
 *
 * API version: 0.1
 * Generated by: OpenAPI Generator (https://openapi-generator.tech)
 */

package service

import (
	"context"
	"errors"
	"net/http"

	dashapi "github.com/moustachioed/dash/backend/dashapi"
	"github.com/moustachioed/dash/backend/mapping"
)

// InboxApiService is a service that implements the logic for the InboxApiServicer
// This service should implement the business logic for every endpoint for the InboxApi API.
// Include any external packages or services that will be required by this service.
type InboxApiService struct {
	ds     DataStore
	mapper mapping.Mapper
}

// NewInboxApiService creates a default api service
func NewInboxApiService(ds DataStore, mapper mapping.Mapper) dashapi.InboxApiServicer {
	return &InboxApiService{
		ds:     ds,
		mapper: mapper,
	}
}

// AddInboxItem -
func (s *InboxApiService) AddInboxItem(ctx context.Context, inboxItem dashapi.InboxItem) (dashapi.ImplResponse, error) {
	item := s.mapper.InboxApiToDs(inboxItem)
	s.ds.WriteInboxItem(item)

	return dashapi.Response(http.StatusOK, nil), nil
}

// DeleteInboxItem -
func (s *InboxApiService) DeleteInboxItem(ctx context.Context, item int32) (dashapi.ImplResponse, error) {

	s.ds.DeleteInboxItem(item)

	return dashapi.Response(http.StatusOK, nil), nil
}

// GetInboxItems -
func (s *InboxApiService) GetInboxItems(ctx context.Context) (dashapi.ImplResponse, error) {
	items, err := s.ds.GetInboxItems()
	if err != nil {
		return dashapi.Response(http.StatusInternalServerError, nil), errors.New("Could not get inbox items")
	}
	apiItems := make([]dashapi.InboxItem, len(items))
	for i, item := range items {
		apiItems[i] = s.mapper.InboxDsToApi(item).(dashapi.InboxItem)
	}

	return dashapi.Response(http.StatusOK, apiItems), nil
}
