package eu.solidcraft.c4diagrams;

import com.structurizr.Workspace;
import com.structurizr.model.Container;
import com.structurizr.model.InteractionStyle;
import com.structurizr.model.SoftwareSystem;
import com.structurizr.view.StaticView;
import com.structurizr.view.ViewSet;
import lombok.Getter;
import lombok.experimental.FieldDefaults;

import java.util.function.Function;

import static eu.solidcraft.c4diagrams.Protocols.WEBSOCET;
import static eu.solidcraft.c4diagrams.ViewCreator.setupView;
import static lombok.AccessLevel.PRIVATE;

class CarShareContainersDiagram {
    static InternalContainers create(Workspace workspace, SoftwareSystem carShareSystem, ExternalSystems externalSystems) {
        InternalContainers internalContainers = new InternalContainers(carShareSystem);
        internalContainers.createUsages(externalSystems);
        setupContainerView(workspace, carShareSystem);
        return internalContainers;
    }

    private static void setupContainerView(Workspace workspace, SoftwareSystem eMobility) {
        Function<ViewSet, StaticView> containerViewCreator = views ->
                views.createContainerView(eMobility,
                        "car share containers",
                        "car share container view");
        setupView(workspace, containerViewCreator);
    }
}

@Getter
@FieldDefaults(makeFinal = true, level = PRIVATE)
class InternalContainers {
    Container bigMonilithicApplication;

    InternalContainers(SoftwareSystem eMobility) {
        bigMonilithicApplication = eMobility.addContainer("Some container to be defined", "With lots of modules inside", "JAVA");
    }

    void createUsages(ExternalSystems externalSystems) {
        externalSystems.getCarsGpsGateway().uses(bigMonilithicApplication, "sends cars gps position", WEBSOCET, InteractionStyle.Asynchronous);
    }
}