/*
 * SDK Pullenti Lingvo, version 4.33, fabruary 2026. Copyright (c) 2013-2026, Pullenti. All rights reserved. 
 * Non-Commercial Freeware and Commercial Software.
 * This class is generated using the converter Unisharping (www.unisharping.ru) from Pullenti C#.NET project. 
 * The latest version of the code is available on the site www.pullenti.ru
 */

const Utils = require("./../../unisharp/Utils");
const Hashtable = require("./../../unisharp/Hashtable");

const MetaToken = require("./../MetaToken");
const ReferentToken = require("./../ReferentToken");
const ProcessorService = require("./../ProcessorService");
const GoodAttributeReferent = require("./GoodAttributeReferent");
const Token = require("./../Token");
const Referent = require("./../Referent");
const PullentiNerCoreInternalResourceHelper = require("./../core/internal/PullentiNerCoreInternalResourceHelper");
const AttrMeta = require("./internal/AttrMeta");
const AnalyzerDataWithOntology = require("./../core/AnalyzerDataWithOntology");
const GoodAttrToken = require("./internal/GoodAttrToken");
const Analyzer = require("./../Analyzer");

/**
 * Анализатор характеристик товаров. Используется, если нужно выделятть только отдельные характеристики, а не товар в целом. 
 * Если примеряется GoodsAnalyzer, то данный анализатор задействовать не нужно. 
 * Специфический анализатор, то есть нужно явно создавать процессор через функцию CreateSpecificProcessor, 
 * указав имя анализатора. 
 * Выделение происходит из небольшого фрагмента текста, содержащего только характеристики. 
 * Выделять из большого текста такие фрагменты - это не задача анализатора.
 */
class GoodsAttrAnalyzer extends Analyzer {
    
    get name() {
        return GoodsAttrAnalyzer.ANALYZER_NAME;
    }
    
    get caption() {
        return "Атрибуты товара";
    }
    
    get description() {
        return "Выделяет только атрибуты (из раздела Характеристик)";
    }
    
    get isSpecific() {
        return true;
    }
    
    clone() {
        return new GoodsAttrAnalyzer();
    }
    
    get typeSystem() {
        return [AttrMeta.GLOBAL_META];
    }
    
    get images() {
        let res = new Hashtable();
        res.put(AttrMeta.ATTR_IMAGE_ID, PullentiNerCoreInternalResourceHelper.getBytes("bullet_ball_glass_grey.png"));
        return res;
    }
    
    createReferent(type) {
        if (type === GoodAttributeReferent.OBJ_TYPENAME) 
            return new GoodAttributeReferent();
        return null;
    }
    
    get progressWeight() {
        return 100;
    }
    
    createAnalyzerData() {
        return new AnalyzerDataWithOntology();
    }
    
    process(kit) {
        let ad = kit.getAnalyzerData(this);
        let delta = 100000;
        let parts = Utils.intDiv(((kit.sofa.text.length + delta) - 1), delta);
        if (parts === 0) 
            parts = 1;
        let cur = 0;
        let nextPos = 0;
        for (let t = kit.firstToken; t !== null; t = t.next) {
            if (t.beginChar > nextPos) {
                nextPos += delta;
                cur++;
                if (!this.onProgress(cur, parts, kit)) 
                    break;
            }
            let at = GoodAttrToken.tryParse(t, null, true, true);
            if (at === null) 
                continue;
            let attr = at._createAttr();
            if (attr === null) {
                t = at.endToken;
                continue;
            }
            let rt = new ReferentToken(attr, at.beginToken, at.endToken);
            rt.referent = ad.registerReferent(attr);
            kit.embedToken(rt);
            t = rt;
        }
    }
    
    static initialize() {
        /* this is synchronized block by GoodsAttrAnalyzer.m_Lock, but this feature isn't supported in JS */ {
            if (GoodsAttrAnalyzer.m_Initialized) 
                return;
            GoodsAttrAnalyzer.m_Initialized = true;
            ProcessorService.registerAnalyzer(new GoodsAttrAnalyzer());
        }
    }
    
    static static_constructor() {
        GoodsAttrAnalyzer.ANALYZER_NAME = "GOODSATTR";
        GoodsAttrAnalyzer.m_Initialized = false;
        GoodsAttrAnalyzer.m_Lock = new Object();
    }
}


GoodsAttrAnalyzer.static_constructor();

module.exports = GoodsAttrAnalyzer