package example;

import dev.miyomiyo.agentbridge.api.*;
import dev.miyomiyo.agentbridge.api.world.*;

import java.nio.file.Path;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

/** Java-only example: state belongs to one visit, including dimension travel. */
public final class VisitExtension implements AgentExtension {
    public String modId() { return "example_visit"; }

    public void register(ExtensionRegistrar registrar) {
        WorldBinding<Visit> world=registrar.world(new WorldLifecycle<Visit>() {
            public Visit open(WorldContext context,Path playerDirectory) { return new Visit(); }
        });
        registrar.query(new QueryDefinition(
                "visit", "Current world visit", "Count dimension transitions during this visit.",
                "{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false}"),
                call->call.context().onClient(()->world.require(call.context()).snapshot()));
    }

    private static final class Visit implements WorldSession {
        private sealed interface State {
            record Active(long transitions) implements State {}
            record Closed() implements State {}
        }
        private State state=new State.Active(0);

        public void relocated(WorldContext context) {
            state=switch(state) {
                case State.Active active -> new State.Active(active.transitions()+1);
                case State.Closed closed -> closed;
            };
        }

        ToolResult snapshot() {
            return switch(state) {
                case State.Active active -> ToolResult.ok("{\"dimensionTransitions\":"+active.transitions()+"}");
                case State.Closed ignored -> ToolResult.error("WORLD_UNAVAILABLE","Visit has ended");
            };
        }

        public CompletionStage<Void> close() {
            state=new State.Closed();
            // No I/O in this example. A real store returns its actual drain completion here.
            return CompletableFuture.completedFuture(null);
        }
    }
}
