001package org.intellimate.izou.sdk.frameworks.common.resources;
002
003import org.intellimate.izou.events.EventModel;
004import org.intellimate.izou.identification.IdentificationManager;
005import org.intellimate.izou.identification.IllegalIDException;
006import org.intellimate.izou.resource.ResourceBuilderModel;
007import org.intellimate.izou.resource.ResourceModel;
008import org.intellimate.izou.sdk.Context;
009import org.intellimate.izou.sdk.frameworks.permanentSoundOutput.resource.UsingSoundResource;
010
011import java.util.ArrayList;
012import java.util.List;
013import java.util.Optional;
014import java.util.stream.Collectors;
015
016/**
017 * base interface to build the resource-providing logic upon (if the project is big enough to have it moved out of
018 * the classes)
019 * @author LeanderK
020 * @version 1.0
021 */
022public interface ResourcesProviderBase extends ResourceBuilderModel {
023    /**
024     * initialises the Interface
025     * @param context the context to use
026     */
027    default void resourcesInit(Context context) {
028        try {
029            context.getResources().registerResourceBuilder(this);
030        } catch (IllegalIDException e) {
031            context.getLogger().error("unable to register ResourceBuilder", e);
032        }
033    }
034
035    @Override
036    default List<? extends ResourceModel> announceResources() {
037        List<ResourceModel> resources = new ArrayList<>();
038        IdentificationManager.getInstance().getIdentification(this)
039                .map(UsingSoundResource::new)
040                .ifPresent(resources::add);
041        return resources;
042    }
043
044    @Override
045    default List<? extends EventModel<?>> announceEvents() {
046        return new ArrayList<>();
047    }
048
049    @Override
050    default List<ResourceModel> provideResource(List<? extends ResourceModel> list, Optional<EventModel> event) {
051        return list.stream()
052                .map(resourceModel -> generateResource(resourceModel, event))
053                .filter(Optional::isPresent)
054                .map(optional -> (ResourceModel) optional.get())
055                .collect(Collectors.toList());
056    }
057
058    /**
059     * generates the resources
060     * @param resourceModel the resourceModel
061     * @param event the Event
062     * @return a Stream containing the resourceModel(s)
063     */
064    default Optional<? extends ResourceModel> generateResource(ResourceModel resourceModel, Optional<EventModel> event) {
065        return Optional.empty();
066    }
067}