import { Grammar } from "../grammar.js"
import { RollPart } from "./roll-part.mjs"

export class RollPartSelect extends RollPart {

  restore(rollData) {
    this.setCurrent(rollData, { key: this.getSaved(rollData)?.key })
  }

  store(rollData, targetData) {
    this.setSaved(targetData, { key: this.getCurrent(rollData).key })
  }

  choices(refs) { return [] }

  getAjustements(rollData) {
    const current = this.getCurrent(rollData)
    if (current) {
      return [{ label: current.label, value: current.value }]
    }
    return []
  }

  selectByKey(rollData, key = undefined, defValue = undefined) {
    const refs = this.getRefs(rollData)
    const choices = this.choices(refs) ??[]
    const current = this.getCurrent(rollData)
    const newChoice = (choices.length == 0)
      ? { key: '', value: defValue }
      : this.$getSelectedChoice(choices, key ?? current?.key ?? refs?.key ?? choices[0].key)
    this.setCurrent(rollData, newChoice)
    return newChoice
  }

  $getSelectedChoice(choices, key) {
    const potential = choices.filter(it => Grammar.includesLowerCaseNoAccent(it.key, key))
    switch (potential.length) {
      case 0:
        // ui.notifications.warn(`Aucun choix de ${this.name} pour ${key}`)
        return choices[0]
      case 1:
        return potential[0]
      default:
        const selected = potential.find(it => Grammar.equalsInsensitive(it.key, key))
        // ui.notifications.info(`Plusieurs choix de ${this.name} pour ${key}, le premier est utilisé`)
        return selected ?? potential[0]
    }
  }

}
