const xpath = require("xpath");
const { DOMParser } = require("xmldom");
const stringSimilarity = require("string-similarity");

/**
 * XML 문서에서 유사한 문자열 찾기
 * @param {string} xmlDoc - XML 문자열
 * @param {string} targetString - 비교할 문자열
 * @param {number} threshold - 유사도 기준 (0~1)
 * @returns {string} - 유사한 문자열
 */
function findSimilarString(xmlDoc, targetString, threshold = 0.8) {
    // XML 내부의 비교 대상 텍스트 리스트 찾기
    function getTextNodes(xmlDoc, stringList = []) {
        const stringNodes = xpath.select("//CRCUnitArr/@Name", xmlDoc);
        stringNodes.forEach(stringNode => {
            stringList.push(stringNode.value);
        });
        return stringList;
    }

    // XML에서 모든 텍스트 추출
    const stringList = getTextNodes(xmlDoc);

    // 유사도 비교하여 가장 유사한 문자열 찾기
    let bestMatch = null;
    let highestSimilarity = 0;

    stringList.forEach(text => {
        const similarity = stringSimilarity.compareTwoStrings(targetString, text);

        // console.log("🚀 ~ findSimilarString ~ text:", text)
        // console.log("🚀 ~ findSimilarString ~ targetString:", targetString)
        // console.log("🚀 ~ findSimilarString ~ similarity:", similarity)

        if (similarity > highestSimilarity && similarity >= threshold) {
            highestSimilarity = similarity;
            bestMatch = text;
        }
    });
    return bestMatch;
}

module.exports = findSimilarString;