<commit_before><?php

/**
 * LibreDTE
 * Copyright (C) SASCO SpA (https://sasco.cl)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General Affero de GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General Affero de GNU para
 * obtener una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
 */

namespace sasco\LibreDTE\Sii\Dte;

/**
 * Clase para convertir entre formatos soportados oficialmente por LibreDTE para
 * los DTE
 * @author <NAME>, DeLaF (esteban[at]sasco.cl)
 * @version 2016-09-12
 */
class Formatos
{

    private static $formatos = []; ///< Formatos oficialmente soportados (para los que existe un parser)

    /**
     * Método que convierte los datos en el formato de entrada a un arreglo PHP
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2016-09-12
     */
    public static function toArray($formato, $datos)
    {
        $class = '\sasco\LibreDTE\Sii\Dte\Formatos\\'.str_replace('.', '\\', $formato);
        if (!class_exists($class)) {
            $class = '\sasco\LibreDTE\Sii\Dte\Formatos\\'.str_replace('.', '\\', strtoupper($formato));
            if (!class_exists($class)) {
                $class = '\sasco\LibreDTE\Sii\Dte\Formatos\\'.str_replace('.', '\\', strtolower($formato));
                if (!class_exists($class)) {
                    throw new \Exception('Formato '.$formato.' no es válido como entrada para datos del DTE');
                }
            }
        }
        return $class::toArray($datos);
    }

    /**
     * Método que convierte los datos en el formato de entrada al formato
     * oficial en JSON
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2018-01-19
     */
    public static function toJSON($formato, $datos)
    {
        return json_encode(self::toArray($formato, $datos), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    }

    /**
     * Método que obtiene el listado de formatos soportados (para los que existe
     * un parser)
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)<commit_msg>Los datos de un DTE se pueden procesar de formatos que están en diferentes namespaces<commit_after><?php

/**
 * LibreDTE
 * Copyright (C) SASCO SpA (https://sasco.cl)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General Affero de GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General Affero de GNU para
 * obtener una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
 */

namespace sasco\LibreDTE\Sii\Dte;

/**
 * Clase para convertir entre formatos soportados oficialmente por LibreDTE para
 * los DTE
 * @author <NAME>, DeLaF (esteban[at]sasco.cl)
 * @version 2020-03-13
 */
class Formatos
{

    private static $namespaces = [
        '\sasco\LibreDTE',
        '\sasco\LibreDTE\Extra'
    ]; ///< Posible ubicaciones para los formatos que LibreDTE soporta
    private static $formatos = []; ///< Formatos oficialmente soportados (para los que existe un parser)

    /**
     * Método que convierte los datos en el formato de entrada a un arreglo PHP
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2020-03-13
     */
    public static function toArray($formato, $datos)
    {
        $founded = false;
        foreach (self::$namespaces as $namespace) {
            $formato = str_replace('.', '\\', $formato);
            $combinations = [
                $namespace.'\Sii\Dte\Formatos\\'.$formato,
                $namespace.'\Sii\Dte\Formatos\\'.strtoupper($formato),
                $namespace.'\Sii\Dte\Formatos\\'.strtolower($formato),
            ];
            foreach ($combinations as $class) {
                if (class_exists($class)) {
                    $founded = $class;
                    break;
                }
            }
            if ($founded) {
                break;
            }
        }
        if (!$founded) {
            throw new \Exception('Formato '.$formato.' no es válido como entrada para datos del DTE');
        }
        return $founded::toArray($datos);
    }

    /**
     * Método que convierte los datos en el formato de entrada al formato
     * oficial en JSON
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
     * @version 2018-01-19
     */
    public static function toJSON($formato, $datos)
    {
        return json_encode(self::toArray($formato, $datos), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    }

    /**
     * Método que obtiene el listado de formatos soportados (para los que existe
     * un parser)
     * @author <NAME>, DeLaF (esteban[at]sasco.cl)
{'fraction_non_alphanumeric': 0.11020408163265306, 'fraction_numerical': 0.008873114463176575, 'mean_word_length': 2.612820512820513, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 13, 'https://': 2, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '738236', 'n_tokens_mistral': 1926, 'n_tokens_neox': 1886, 'n_words': 556}