import {
  AutoCompleteProposal,
  AutoCompleteProvider,
} from "../../../registries/auto_completes/auto_complete_registry";
import { SpreadsheetStore } from "../../../stores/spreadsheet_store";

export class AutoCompleteStore extends SpreadsheetStore {
  mutators = ["useProvider", "moveSelection", "hide", "selectIndex"] as const;
  selectedIndex: number | undefined = undefined;
  provider: AutoCompleteProvider | undefined;

  get selectedProposal(): AutoCompleteProposal | undefined {
    if (this.selectedIndex === undefined || this.provider === undefined) {
      return undefined;
    }
    return this.provider.proposals[this.selectedIndex];
  }

  useProvider(provider: AutoCompleteProvider) {
    this.provider = provider;
    this.selectedIndex = provider.autoSelectFirstProposal ? 0 : undefined;
  }

  hide() {
    this.provider = undefined;
    this.selectedIndex = undefined;
  }

  selectIndex(index: number) {
    this.selectedIndex = index;
  }

  moveSelection(direction: "previous" | "next") {
    if (!this.provider) {
      return;
    }
    if (this.selectedIndex === undefined) {
      this.selectedIndex = 0;
      return;
    }
    if (direction === "previous") {
      this.selectedIndex--;
      if (this.selectedIndex < 0) {
        this.selectedIndex = this.provider.proposals.length - 1;
      }
    } else {
      this.selectedIndex = (this.selectedIndex + 1) % this.provider.proposals.length;
    }
  }
}
