/*
 * SDK Pullenti Unitext, 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# project. 
 * The latest version of the code is available on the site www.pullenti.ru
 */

package com.pullenti.unitext;

/**
 * Представление стилей. Реализовано пока только для формата DOCX.
 * Стиль
 */
public class UnitextStyle {

    /**
     * Значения атрибутов (как в CSS). Составные атрибуты не поддерживаются, то есть 
     * нет font, но есть по отдельности font-name, font-size, font-weight и т.д.
     */
    public java.util.HashMap<String, String> attrs = new java.util.HashMap<String, String>();

    /**
     * Внутренний идентификатор (0 - используется по умолчанию)
     */
    public int id;

    @Override
    public String toString() {
        StringBuilder tmp = new StringBuilder();
        for (java.util.Map.Entry<String, String> at : attrs.entrySet()) {
            if (tmp.length() > 0) 
                tmp.append(" ");
            tmp.append(at.getKey()).append(":").append(at.getValue());
        }
        return tmp.toString();
    }

    /**
     * Получить значение атрибута
     * @param name имя
     * @return значение
     */
    public String getAttr(String name) {
        String res;
        com.pullenti.unisharp.Outargwrapper<String> wrapres630 = new com.pullenti.unisharp.Outargwrapper<String>();
        boolean inoutres631 = com.pullenti.unisharp.Utils.tryGetValue(attrs, name, wrapres630);
        res = wrapres630.value;
        if (inoutres631) 
            return res;
        return null;
    }

    public void addAttr(String name, String val, boolean appendVal) {
        if (com.pullenti.unisharp.Utils.isNullOrEmpty(val)) 
            return;
        String val0;
        com.pullenti.unisharp.Outargwrapper<String> wrapval0632 = new com.pullenti.unisharp.Outargwrapper<String>();
        boolean inoutres633 = com.pullenti.unisharp.Utils.tryGetValue(attrs, name, wrapval0632);
        val0 = wrapval0632.value;
        if (!inoutres633) 
            attrs.put(name, val);
        else if (!appendVal || val0 == null) 
            attrs.put(name, val);
        else if (val0.indexOf(';') < 0) 
            attrs.put(name, (val0 + ";" + val));
        else {
            String[] vals = com.pullenti.unisharp.Utils.split(val0, String.valueOf(';'), false);
            for (int i = 0; i < vals.length; i++) {
                if (com.pullenti.unisharp.Utils.stringsEq(vals[i], val)) 
                    return;
            }
            attrs.put(name, (val0 + ";" + val));
        }
    }

    public void removeInheritAttrs(UnitextStyledFragment fr) {
        java.util.ArrayList<String> dels = null;
        for (java.util.Map.Entry<String, String> kp : attrs.entrySet()) {
            String val = null;
            for (UnitextStyledFragment p = fr; p != null; p = p.parent) {
                if (p.styleId >= 0 && p.getStyle() != null) {
                    if ((((val = p.getStyle().getAttr(kp.getKey())))) != null) 
                        break;
                }
            }
            if (val == null || com.pullenti.unisharp.Utils.stringsNe(val, kp.getValue())) 
                continue;
            if (dels == null) 
                dels = new java.util.ArrayList<String>();
            dels.add(kp.getKey());
        }
        if (dels != null) {
            for (String k : dels) {
                attrs.remove(k);
            }
        }
    }

    public UnitextStyle clone(boolean ignoreBlockAttrs) {
        UnitextStyle res = new UnitextStyle();
        this.copyTo(res);
        return res;
    }

    public void copyTo(UnitextStyle res) {
        res.id = id;
        for (java.util.Map.Entry<String, String> kp : attrs.entrySet()) {
            if (!res.attrs.containsKey(kp.getKey())) 
                res.addAttr(kp.getKey(), kp.getValue(), false);
            else 
                res.attrs.put(kp.getKey(), kp.getValue());
        }
    }

    public void getXml(com.pullenti.unisharp.XmlWriterWrapper xml) throws javax.xml.stream.XMLStreamException {
        xml.wr.writeStartElement("style");
        xml.wr.writeAttribute("id", ((Integer)id).toString());
        for (java.util.Map.Entry<String, String> kp : attrs.entrySet()) {
            xml.wr.writeAttribute(kp.getKey(), kp.getValue());
        }
        xml.wr.writeEndElement();
    }

    public void fromXml(org.w3c.dom.Node xml) throws NumberFormatException {
        if (xml.getAttributes() != null) {
            for (org.w3c.dom.Node a : (new com.pullenti.unisharp.XmlAttrListWrapper(xml.getAttributes())).arr) {
                if (com.pullenti.unisharp.Utils.stringsEq(com.pullenti.unisharp.Utils.getXmlLocalName(a), "id")) 
                    id = com.pullenti.unisharp.Utils.parseInteger(a.getNodeValue(), 0, null);
                else 
                    this.addAttr(com.pullenti.unisharp.Utils.getXmlLocalName(a), a.getNodeValue(), false);
            }
        }
    }

    /**
     * Вывести в Html значение атрибута style="..."
     * @param res 
     */
    public void getHtml(StringBuilder res) {
        for (java.util.Map.Entry<String, String> kp : attrs.entrySet()) {
            if (com.pullenti.unisharp.Utils.stringsEq(kp.getKey(), "heading-level")) 
                continue;
            res.append(kp.getKey()).append(":").append(kp.getValue()).append(";");
        }
    }
    public UnitextStyle() {
    }
}
