
// numero.js — Funções utilitárias para normalização e detecção de contexto numérico multilíngue
// Projeto: Flash Card Navegador
// Suporte: pt, en, fr, es, it, de, zh, ko, ja

/**
 * Verifica se o texto representa um número em contexto especial (moeda, horário, medida, percentual, telefone, etc.)
 * @param {string} text
 * @returns {boolean}
 */
function isContextualNumber(text) {
    if (!text) return false;
    const t = text.toLowerCase().trim();
    // Moeda (vários idiomas)
    if (/\d+[,.]?\d*\s*(euro|euros|dolar|dólar|dolares|dólares|real|reais|dollar|dollars|pound|pounds|libra|libras|yen|iene|ienes|yuan|yuans|元|엔|円)/.test(t)) return true;
    // Horário
    if (/\d{1,2}h\d{2}/.test(t) || /\d+\s*(h|hora|horas|heure|heures|ora|ore|hora|horas|uhr|时|시|時)/.test(t)) return true;
    // Percentual
    if (/\d+%/.test(t)) return true;
    // Medidas (kg, g, l, etc. em vários idiomas)
    if (/\d+\s*(kg|g|grama|gramas|kilo|kilos|mm|cm|m|km|lt|l|litro|litros|gram|grams|liter|liters|gramme|grammes|litre|litres|grammo|grammi|litro|litri|gramm|gramme|liter|litern|克|千克|公斤|升|リットル|グラム|킬로그램|리터)/.test(t)) return true;
    // Polegadas
    if (/\d+'/.test(t)) return true;
    // Número explícito
    if (/\d+\s*(número|numéro|number|numero|nummer|数字|번호|番号)/.test(t)) return true;
    // Telefone
    if (/(fone|celular|cel\.?|tel\.?|telefone|phone|telefono|téléphone|telefon|电话|전화|電話)\s*:?\s*\d+/.test(t)) return true;
    // Código com #
    if (/#[0-9]+/.test(t)) return true;
    // Fração
    if (/\d+\/\d+/.test(t)) return true;
    // Data
    if (/\d{1,2}\/\d{1,2}\/\d{2,4}/.test(t) || /\d{1,2}-\d{1,2}-\d{2,4}/.test(t)) return true;
    // Percentual por extenso (ex: "por cento", "pour cent", etc.)
    if (/\d+\s*(por cento|pour cent|percento|prozent|percent|パーセント|퍼센트|百分之)/.test(t)) return true;
    return false;
}

/**
 * Mapeamento multilíngue de números por extenso para algarismos
 * Adicione mais números conforme necessário
 */
const NUMBER_WORDS = {
    // Português
    'zero': '0', 'um': '1', 'uma': '1', 'dois': '2', 'duas': '2', 'três': '3', 'tres': '3', 'quatro': '4', 'cinco': '5', 'seis': '6', 'sete': '7', 'oito': '8', 'nove': '9', 'dez': '10',
    // Inglês
    'zero': '0', 'one': '1', 'two': '2', 'three': '3', 'four': '4', 'five': '5', 'six': '6', 'seven': '7', 'eight': '8', 'nine': '9', 'ten': '10',
    // Francês
    'zéro': '0', 'un': '1', 'une': '1', 'deux': '2', 'trois': '3', 'quatre': '4', 'cinq': '5', 'six': '6', 'sept': '7', 'huit': '8', 'neuf': '9', 'dix': '10',
    // Espanhol
    'cero': '0', 'uno': '1', 'una': '1', 'dos': '2', 'tres': '3', 'cuatro': '4', 'cinco': '5', 'seis': '6', 'siete': '7', 'ocho': '8', 'nueve': '9', 'diez': '10',
    // Italiano
    'zero': '0', 'uno': '1', 'una': '1', 'due': '2', 'tre': '3', 'quattro': '4', 'cinque': '5', 'sei': '6', 'sette': '7', 'otto': '8', 'nove': '9', 'dieci': '10',
    // Alemão
    'null': '0', 'eins': '1', 'eine': '1', 'zwei': '2', 'drei': '3', 'vier': '4', 'fünf': '5', 'sechs': '6', 'sieben': '7', 'acht': '8', 'neun': '9', 'zehn': '10',
    // Chinês (simplificado, pinyin)
    'ling': '0', 'yi': '1', 'er': '2', 'san': '3', 'si': '4', 'wu': '5', 'liu': '6', 'qi': '7', 'ba': '8', 'jiu': '9', 'shi': '10',
    // Chinês (caracteres)
    '零': '0', '一': '1', '二': '2', '三': '3', '四': '4', '五': '5', '六': '6', '七': '7', '八': '8', '九': '9', '十': '10',
    // Coreano (hangul)
    '영': '0', '일': '1', '이': '2', '삼': '3', '사': '4', '오': '5', '육': '6', '칠': '7', '팔': '8', '구': '9', '십': '10',
    // Japonês (kanji)
    '零': '0', '一': '1', '二': '2', '三': '3', '四': '4', '五': '5', '六': '6', '七': '7', '八': '8', '九': '9', '十': '10',
    // Japonês (romaji)
    'rei': '0', 'ichi': '1', 'ni': '2', 'san': '3', 'shi': '4', 'yon': '4', 'go': '5', 'roku': '6', 'shichi': '7', 'nana': '7', 'hachi': '8', 'kyuu': '9', 'ku': '9', 'juu': '10'
};


/**
 * Converte números por extenso para algarismos em múltiplos idiomas em tempo de execução.
 * Detecta o idioma automaticamente (ou recebe como parâmetro) e usa o parser adequado.
 * Para idiomas sem parser, retorna o texto original.
 * @param {string} text
 * @param {string} [lang] - Código do idioma (ex: 'pt', 'en', 'fr', 'es', 'it', 'de', 'zh', 'ko', 'ja')
 * @returns {string}
 */
function normalizeNumberWords(text, lang) {
    if (!text) return text;
    // Detecta idioma se não informado (exemplo simples, pode ser melhorado)
    lang = lang || (window.TO || 'pt').toLowerCase();

    // Parsers para cada idioma
    const parsers = {
        pt: parseNumberPT,
        ptbr: parseNumberPT,
        ptpt: parseNumberPT,
        en: parseNumberEN,
        fr: parseNumberFR,
        es: parseNumberES,
        it: parseNumberIT,
        de: parseNumberDE,
        zh: parseNumberZH,
        ko: parseNumberKO,
        ja: parseNumberJA
    };
    const parser = parsers[lang] || ((t) => t);
    return parser(text);
}

// ===================== Parsers para cada idioma =====================

// Português (corrigido: suporta milhares, milhões, vírgulas e agrupamento)
function parseNumberPT(text) {
    // Mapeamento expandido
    const map = {
        'zero':0,'um':1,'uma':1,'dois':2,'duas':2,'três':3,'tres':3,'quatro':4,'cinco':5,'seis':6,'sete':7,'oito':8,'nove':9,'dez':10,
        'onze':11,'doze':12,'treze':13,'catorze':14,'quatorze':14,'quinze':15,'dezesseis':16,'dezessete':17,'dezoito':18,'dezenove':19,
        'vinte':20,'trinta':30,'quarenta':40,'cinquenta':50,'sessenta':60,'setenta':70,'oitenta':80,'noventa':90,
        'cem':100,'cento':100,'duzentos':200,'trezentos':300,'quatrocentos':400,'quinhentos':500,'seiscentos':600,'setecentos':700,'oitocentos':800,'novecentos':900,
        'mil':1000,'milhão':1000000,'milhoes':1000000,'milhão':1000000,'milhões':1000000
    };
    // Remove vírgulas e normaliza texto
    let words = text.toLowerCase().replace(/,/g, ' ').replace(/ e /g, ' ').replace(/\s+/g, ' ').trim().split(' ');
    let total = 0, acc = 0, lastMultiplier = 1;
    for (let i = 0; i < words.length; i++) {
        let w = words[i];
        if (!w) continue;
        if (map[w] !== undefined) {
            let val = map[w];
            if (val === 1000 || val === 1000000) {
                if (acc === 0) acc = 1;
                acc *= val;
                total += acc;
                acc = 0;
                lastMultiplier = val;
            } else {
                acc += val;
            }
        } else if (/^\d+$/.test(w)) {
            acc += parseInt(w, 10);
        }
    }
    total += acc;
    return total ? total.toString() : text;
}

// Inglês (básico)
function parseNumberEN(text) {
    const map = {
        'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9,'ten':10,
        'eleven':11,'twelve':12,'thirteen':13,'fourteen':14,'fifteen':15,'sixteen':16,'seventeen':17,'eighteen':18,'nineteen':19,
        'twenty':20,'thirty':30,'forty':40,'fifty':50,'sixty':60,'seventy':70,'eighty':80,'ninety':90,
        'hundred':100,'thousand':1000
    };
    let total = 0, acc = 0;
    let words = text.toLowerCase().replace(/ and /g, ' ').split(/\s+/);
    for (let w of words) {
        if (map[w] !== undefined) {
            if (w === 'hundred') {
                acc = (acc || 1) * 100;
            } else if (w === 'thousand') {
                acc = (acc || 1) * 1000;
                total += acc;
                acc = 0;
            } else {
                acc += map[w];
            }
        } else if (/^\d+$/.test(w)) {
            acc += parseInt(w, 10);
        }
    }
    total += acc;
    return total ? total.toString() : text;
}

// Francês (básico)
function parseNumberFR(text) {
    const map = {
        'zéro':0,'un':1,'une':1,'deux':2,'trois':3,'quatre':4,'cinq':5,'six':6,'sept':7,'huit':8,'neuf':9,'dix':10,
        'onze':11,'douze':12,'treize':13,'quatorze':14,'quinze':15,'seize':16,'dix-sept':17,'dix-huit':18,'dix-neuf':19,
        'vingt':20,'trente':30,'quarante':40,'cinquante':50,'soixante':60,'soixante-dix':70,'quatre-vingt':80,'quatre-vingt-dix':90,
        'cent':100,'cents':100,'mille':1000
    };
    let total = 0, acc = 0;
    let words = text.toLowerCase().replace(/ et /g, ' ').replace(/-/g, ' ').split(/\s+/);
    for (let w of words) {
        if (map[w] !== undefined) {
            if (w === 'mille') {
                acc = (acc || 1) * 1000;
                total += acc;
                acc = 0;
            } else if (w === 'cent' || w === 'cents') {
                acc = (acc || 1) * 100;
            } else {
                acc += map[w];
            }
        } else if (/^\d+$/.test(w)) {
            acc += parseInt(w, 10);
        }
    }
    total += acc;
    return total ? total.toString() : text;
}

// Espanhol (básico)
function parseNumberES(text) {
    const map = {
        'cero':0,'uno':1,'una':1,'dos':2,'tres':3,'cuatro':4,'cinco':5,'seis':6,'siete':7,'ocho':8,'nueve':9,'diez':10,
        'once':11,'doce':12,'trece':13,'catorce':14,'quince':15,'dieciséis':16,'diecisiete':17,'dieciocho':18,'diecinueve':19,
        'veinte':20,'treinta':30,'cuarenta':40,'cincuenta':50,'sesenta':60,'setenta':70,'ochenta':80,'noventa':90,
        'cien':100,'ciento':100,'doscientos':200,'trescientos':300,'cuatrocientos':400,'quinientos':500,'seiscientos':600,'setecientos':700,'ochocientos':800,'novecientos':900,'mil':1000
    };
    let total = 0, acc = 0;
    let words = text.toLowerCase().replace(/ y /g, ' ').split(/\s+/);
    for (let w of words) {
        if (map[w] !== undefined) {
            if (w === 'mil') {
                acc = (acc || 1) * 1000;
                total += acc;
                acc = 0;
            } else {
                acc += map[w];
            }
        } else if (/^\d+$/.test(w)) {
            acc += parseInt(w, 10);
        }
    }
    total += acc;
    return total ? total.toString() : text;
}

// Italiano (básico)
function parseNumberIT(text) {
    const map = {
        'zero':0,'uno':1,'una':1,'due':2,'tre':3,'quattro':4,'cinque':5,'sei':6,'sette':7,'otto':8,'nove':9,'dieci':10,
        'undici':11,'dodici':12,'tredici':13,'quattordici':14,'quindici':15,'sedici':16,'diciassette':17,'diciotto':18,'diciannove':19,
        'venti':20,'trenta':30,'quaranta':40,'cinquanta':50,'sessanta':60,'settanta':70,'ottanta':80,'novanta':90,
        'cento':100,'duecento':200,'trecento':300,'quattrocento':400,'cinquecento':500,'seicento':600,'settecento':700,'ottocento':800,'novecento':900,'mille':1000
    };
    let total = 0, acc = 0;
    let words = text.toLowerCase().replace(/ e /g, ' ').split(/\s+/);
    for (let w of words) {
        if (map[w] !== undefined) {
            if (w === 'mille') {
                acc = (acc || 1) * 1000;
                total += acc;
                acc = 0;
            } else {
                acc += map[w];
            }
        } else if (/^\d+$/.test(w)) {
            acc += parseInt(w, 10);
        }
    }
    total += acc;
    return total ? total.toString() : text;
}

// Alemão (básico)
function parseNumberDE(text) {
    const map = {
        'null':0,'eins':1,'eine':1,'zwei':2,'drei':3,'vier':4,'fünf':5,'sechs':6,'sieben':7,'acht':8,'neun':9,'zehn':10,
        'elf':11,'zwölf':12,'dreizehn':13,'vierzehn':14,'fünfzehn':15,'sechzehn':16,'siebzehn':17,'achtzehn':18,'neunzehn':19,
        'zwanzig':20,'dreißig':30,'vierzig':40,'fünfzig':50,'sechzig':60,'siebzig':70,'achtzig':80,'neunzig':90,
        'hundert':100,'tausend':1000
    };
    let total = 0, acc = 0;
    let words = text.toLowerCase().replace(/ und /g, ' ').split(/\s+/);
    for (let w of words) {
        if (map[w] !== undefined) {
            if (w === 'tausend') {
                acc = (acc || 1) * 1000;
                total += acc;
                acc = 0;
            } else if (w === 'hundert') {
                acc = (acc || 1) * 100;
            } else {
                acc += map[w];
            }
        } else if (/^\d+$/.test(w)) {
            acc += parseInt(w, 10);
        }
    }
    total += acc;
    return total ? total.toString() : text;
}

// Chinês (placeholder, use biblioteca para produção)
function parseNumberZH(text) {
    // Para produção, use biblioteca especializada para chinês
    return text;
}

// Coreano (placeholder, use biblioteca para produção)
function parseNumberKO(text) {
    // Para produção, use biblioteca especializada para coreano
    return text;
}

// Japonês (placeholder, use biblioteca para produção)
function parseNumberJA(text) {
    // Para produção, use biblioteca especializada para japonês
    return text;
}

/**
 * Remove acentos e normaliza texto para comparação
 * @param {string} s
 * @returns {string}
 */
function baseNorm(s) {
    if (!s) return '';
    return s.toLowerCase()
        .normalize('NFD').replace(/[\u0300-\u036f]/g, '')
        .replace(/[^\p{L}\p{N}\s]/gu, '')
        .replace(/\s+/g, ' ')
        .trim();
}

// Exporte para uso global
window.NumeroUtils = {
    isContextualNumber,
    normalizeNumberWords,
    baseNorm
};
