package applicationservice

import (
	"bitbucket.org/nemt/nemt-portal-api/application/entitymapping"
	"bitbucket.org/nemt/nemt-portal-api/application/viewmodel"
	"bitbucket.org/nemt/nemt-portal-api/domain/service"
)

// providerService holds methods to provider application service
type planService struct {
	svc       *service.Service
	mapEntity *entitymapping.Mapper
}

// newProviderService returns a providerService instance
func newPlanService(svc *service.Service, mapper *entitymapping.Mapper) *planService {
	return &planService{
		svc:       svc,
		mapEntity: mapper,
	}
}

func (s *planService) GetByAlphaPrefix(alphaPrefix string) (viewmodel.Plan, error) {
	plan, err := s.svc.Plans.GetByAlphaPrefix(alphaPrefix)
	if err != nil {
		return viewmodel.Plan{}, err
	}

	return s.mapEntity.Plan.ToPlanModel(plan), nil
}

func (s *planService) GetByUUID(planUUID string) ([]viewmodel.Plan, error) {
	plans, err := s.svc.Plans.GetByUUID(planUUID)
	if err != nil {
		return nil, err
	}

	return s.mapEntity.Plan.ToPlanModelSlice(plans), nil
}

func (s *planService) GetByID(planID int64) ([]viewmodel.Plan, error) {
	plans, err := s.svc.Plans.GetByID(planID)
	if err != nil {
		return nil, err
	}

	return s.mapEntity.Plan.ToPlanModelSlice(plans), nil
}

func (s *planService) GetByPrefixUUID(prefixUUID string) (viewmodel.Plan, error) {
	plan, err := s.svc.Plans.GetByPrefixUUID(prefixUUID)
	if err != nil {
		return viewmodel.Plan{}, err
	}

	return s.mapEntity.Plan.ToPlanModel(plan), nil
}
