<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Simulatore contabilità
 *
 * @package    mod_mtcontabilita
 * @copyright  2026 Mediatouch 2000 Srl <https://www.mediatouch.it>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 * @author     Marco Cappuccio <m.cappuccio@mediatouch.it>
 */

defined('MOODLE_INTERNAL') || die();

global $CFG;
require_once($CFG->libdir.'/form/text.php');

/**
 * mtcurrency class
 */
class MoodleQuickForm_mtcurrency extends MoodleQuickForm_text {

    /**
     * construct
     */
    public function __construct($elementname = null, $elementlabel = null, $attributes = null) {
        parent::__construct($elementname, $elementlabel, $attributes);

        $attrs = $this->getAttributes();

        // Classe per aggancio AMD (sull'input stesso).
        if (!empty($attrs['class'])) {
            $attrs['class'] .= ' mtcurrency';
        } else {
            $attrs['class'] = 'mtcurrency';
        }

        // Marker utile per selezionare in modo robusto.
        $attrs['data-mtcurrency'] = '1';

        // Evita che QuickForm faccia sanitizzazioni aggressive.
        // (La normalizzazione la facciamo noi, e in pagina/JS).
        if (empty($attrs['autocomplete'])) {
            $attrs['autocomplete'] = 'off';
        }

        $this->setAttributes($attrs);
    }

    /**
     * event
     */
    public function onQuickFormEvent($event, $arg, &$caller) {
        switch ($event) {
            case 'createElement':
                // Importante: RAW, perché l'utente può inserire punti/virgole/spazi.
                $caller->setType($arg[0], PARAM_RAW_TRIMMED);
                return parent::onQuickFormEvent($event, $arg, $caller);

            case 'updateValue':
                // NON formattare qui. Lascia il valore così com'è: lo formatterà l'AMD in pagina.
                $value = $this->_findValue($caller->_constantValues);
                if ($value === null) {
                    $value = $this->_findValue($caller->_submitValues);
                }
                if ($value === null) {
                    $value = $this->_findValue($caller->_defaultValues);
                }
                if ($value !== null) {
                    parent::setValue($value);
                }
                return true;

            default:
                return parent::onQuickFormEvent($event, $arg, $caller);
        }
    }

    /**
     * Validazione: accetta IT o EN in base a current_language().
     * NB: la regola "studente non può usare decimali" la metteremo poi sulle pagine studente,
     *     qui ci limitiamo al docente (sempre ammesso).
     */
    public function validateSubmitValue($value) {
        if ($value === '' || $value === null) {
            return null;
        }

        $lang = current_language();
        $clean = $this->normalize_to_db_string((string)$value, $lang);
        if ($clean === '') {
            return get_string('err_numeric', 'core_form');
        }

        // Numerico?
        if (!is_numeric($clean)) {
            return get_string('err_numeric', 'core_form');
        }

        // Positivo (se vuoi tenerlo).
        if ((float)$clean < 0) {
            return get_string('err_positive', 'core_form');
        }

        return null;
    }

    /**
     * NON formattare in output HTML: lo fa l'AMD.
     */
    public function setValue($value) {
        if (is_array($value)) {
            $value = reset($value);
        }
        parent::setValue($value);
    }

    /**
     * Restituisce stringa normalizzata (DB friendly), NON float.
     */
    public function getValue() {
        $value = parent::getValue();
        if ($value === '' || $value === null) {
            return null;
        }
        $lang = current_language();
        $clean = $this->normalize_to_db_string((string)$value, $lang);
        return ($clean === '') ? null : $clean;
    }

    /**
     * Export: normalizza e restituisce stringa tipo "1234.56".
     */
    public function exportValue(&$submitvalues, $assoc = false) {
        $value = $this->_findValue($submitvalues);
        if ($value === null) {
            $value = $this->getValue();
        } else if ($value !== '') {
            $lang = current_language();
            $value = $this->normalize_to_db_string((string)$value, $lang);
        }

        return $this->_prepareValue($value, $assoc);
    }

    /**
     * Normalizza input umano (IT/EN) in una stringa DB-friendly:
     * - niente separatori migliaia
     * - decimale con "."
     */
    private function normalize_to_db_string(string $str, string $lang): string {
        $str = trim($str);
        if ($str === '') {
            return '';
        }

        // Tolgo spazi (anche NBSP).
        $str = preg_replace('/[[:space:]\x{00A0}]+/u', '', $str);

        if (substr($lang, 0, 2) === 'it') {
            // IT:
            // - se c'è virgola: '1.234,56' => '1234.56'
            // - se NON c'è virgola: lascia eventuale '.' come decimale (valori DB/en-friendly)
            if (strpos($str, ',') !== false) {
                $str = str_replace('.', '', $str);
                $str = str_replace(',', '.', $str);
            }
        } else {
            // EN:
            // '1,234.56' => '1234.56'
            $str = str_replace(',', '', $str);
        }

        return $str;
    }
}
