import React from "react";
import HistoryNavigator from "./historynavigator";
import { DynamicGraph } from "../graph";
import NodeDetails from "./nodedetails";
import { NodeTypesEditor } from "./nodetypeseditor";
import Settings from "./settings";
import Instructions from "./instructions";
import { Checkpoint, History } from "../../common/history";
import { Node } from "../../common/graph/node";
import { NodeType } from "../../common/graph/nodetype";
import { SimGraphData } from "../../common/graph/graph";
import { NodeDataChangeRequest } from "../editor";

interface SidepanelProps {
    graph: DynamicGraph;
    onCheckpointLoad: { (checkpoint: Checkpoint<SimGraphData>): void };
    onNodeTypeSelect: (type: NodeType) => void;
    onConnectOnDragChange: (connectOnDrag: boolean) => void;
    onLabelVisibilityChange: (state: boolean) => void;
    onNodeDataChange: { (requests: NodeDataChangeRequest[]): void };
    selectedNodes: Node[];
    visibleLabels: boolean;
    connectOnDrag: boolean;
}

function Sidepanel({
    graph,
    onCheckpointLoad,
    onNodeTypeSelect,
    onConnectOnDragChange,
    onLabelVisibilityChange,
    onNodeDataChange,
    selectedNodes,
    visibleLabels,
    connectOnDrag,
}: SidepanelProps) {
    return (
        <div id="sidepanel">
            <HistoryNavigator
                history={graph.history}
                onCheckpointLoad={onCheckpointLoad}
            />
            <hr />
            <NodeDetails
                selectedNodes={selectedNodes}
                nameToObjectType={graph.nameToObjectGroup} // TODO: Change to id
                onNodeDataChange={onNodeDataChange}
            />
            <hr />
            <NodeTypesEditor
                onChange={() =>
                    console.log("Refactor onChange for nodetypes editor!")
                } // TODO: Refactor
                graph={graph}
                onSelectAll={onNodeTypeSelect}
            />
            <hr />
            <Settings
                labelVisibility={visibleLabels}
                onLabelVisibilityChange={onLabelVisibilityChange}
                connectOnDrag={connectOnDrag}
                onConnectOnDragChange={onConnectOnDragChange}
            />
            <hr />

            <Instructions connectOnDragEnabled={connectOnDrag} />
        </div>
    );
}

export default Sidepanel;