<?php

namespace dokuwiki\plugin\config\core\Setting;

/**
 * Class setting_multichoice
 */
class SettingMultichoice extends SettingString
{
    protected $choices = [];
    public $lang; //some custom language strings are stored in setting

    /** @inheritdoc */
    public function html(\admin_plugin_config $plugin, $echo = false)
    {
        $disable = '';
        $nochoice = '';

        if ($this->isProtected()) {
            $value = $this->protected;
            $disable = ' disabled="disabled"';
        } else {
            $value = is_null($this->local) ? $this->default : $this->local;
        }

        // ensure current value is included
        if (!in_array($value, $this->choices)) {
            $this->choices[] = $value;
        }
        // disable if no other choices
        if (!$this->isProtected() && count($this->choices) <= 1) {
            $disable = ' disabled="disabled"';
            $nochoice = $plugin->getLang('nochoice');
        }

        $key = htmlspecialchars($this->key);

        $label = '<label for="config___' . $key . '">' . $this->prompt($plugin) . '</label>';

        $input = "<div class=\"input\">\n";
        $input .= '<select class="edit" id="config___' . $key . '" name="config[' . $key . ']"' . $disable . '>' . "\n";
        foreach ($this->choices as $choice) {
            $selected = ($value == $choice) ? ' selected="selected"' : '';
            $option = $plugin->getLang($this->key . '_o_' . $choice);
            if (!$option && isset($this->lang[$this->key . '_o_' . $choice])) {
                $option = $this->lang[$this->key . '_o_' . $choice];
            }
            if (!$option) $option = $choice;

            $choice = htmlspecialchars($choice);
            $option = htmlspecialchars($option);
            $input .= '  <option value="' . $choice . '"' . $selected . ' >' . $option . '</option>' . "\n";
        }
        $input .= "</select> $nochoice \n";
        $input .= "</div>\n";

        return [$label, $input];
    }

    /** @inheritdoc */
    public function update($input)
    {
        if (is_null($input)) return false;
        if ($this->isProtected()) return false;

        $value = is_null($this->local) ? $this->default : $this->local;
        if ($value == $input) return false;

        if (!in_array($input, $this->choices)) return false;

        $this->local = $input;
        return true;
    }
}