import { GoBoard } from "./components/Board";
import { CoreRequest, CoreResponse } from "core-types";
import { CoreApi, initCore } from "./coreApi";
// import { assertNever } from "./assertNever";

class UIState {
  private currentView: GoBoard | null;
  private rootElement: HTMLElement;
  coreApi: CoreApi;

  constructor(coreApi: CoreApi, root: HTMLElement) {
    this.currentView = null;
    this.rootElement = root;
    this.coreApi = coreApi;

    if (!root) {
      console.log("root element not found");
      return;
    }
  }

  processResponse(response: CoreResponse) {
    switch (response.type) {
      case "PlayingFieldView":
        if (this.currentView) {
          this.currentView.setBoard(response.content.board);
        } else {
          this.currentView = new GoBoard({
            board: response.content.board,
            onClick: async (request: CoreRequest) => {
              const response = await this.coreApi.dispatch(request);
              this.processResponse(response);
            },
          });
          this.rootElement?.appendChild(this.currentView.canvas);
          this.currentView.renderBoard();
        }
        break;
      default:
        console.log("impossible branch: ", response);
        alert("impossible branch");
        // assertNever(response);
        break;
    }
  }
}

const main = async () => {
  let coreApi = await initCore();
  let response = await coreApi.dispatch({ type: "PlayingField" });
  const root = document.getElementById("root");

  if (!root) {
    console.log("root element not present");
    return;
  }

  const uiState = new UIState(coreApi, root);
  uiState.processResponse(response);
};

main();
