package incheon.ags.mrb.style.utils;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * SLD XML Element 생성을 위한 빌더 유틸리티
 * 반복적인 Element 생성 코드를 간결하게 만들어줌
 */
public class SldElementBuilder {

    private static final String SLD_NAMESPACE = "http://www.opengis.net/sld";
    private static final String OGC_NAMESPACE = "http://www.opengis.net/ogc";

    private final Document doc;
    private final Element element;

    private SldElementBuilder(Document doc, Element element) {
        this.doc = doc;
        this.element = element;
    }

    /**
     * SLD 네임스페이스 Element 생성
     */
    public static SldElementBuilder createSld(Document doc, String tagName) {
        Element element = doc.createElementNS(SLD_NAMESPACE, tagName);
        return new SldElementBuilder(doc, element);
    }

    /**
     * OGC 네임스페이스 Element 생성
     */
    public static SldElementBuilder createOgc(Document doc, String tagName) {
        Element element = doc.createElementNS(OGC_NAMESPACE, "ogc:" + tagName);
        return new SldElementBuilder(doc, element);
    }

    /**
     * 텍스트 콘텐츠 설정
     */
    public SldElementBuilder text(String content) {
        if (content != null) {
            element.setTextContent(content);
        }
        return this;
    }

    /**
     * 속성 추가
     */
    public SldElementBuilder attr(String name, String value) {
        if (value != null) {
            element.setAttribute(name, value);
        }
        return this;
    }

    /**
     * 자식 Element 추가 (빌더 반환)
     */
    public SldElementBuilder child(String tagName) {
        Element child = doc.createElementNS(SLD_NAMESPACE, tagName);
        element.appendChild(child);
        return new SldElementBuilder(doc, child);
    }

    /**
     * OGC 자식 Element 추가
     */
    public SldElementBuilder ogcChild(String tagName) {
        Element child = doc.createElementNS(OGC_NAMESPACE, "ogc:" + tagName);
        element.appendChild(child);
        return new SldElementBuilder(doc, child);
    }

    /**
     * 자식 Element 추가 (직접 Element 전달)
     */
    public SldElementBuilder appendChild(Element child) {
        element.appendChild(child);
        return this;
    }

    /**
     * CssParameter 추가
     */
    public SldElementBuilder cssParam(String name, String value) {
        if (value != null) {
            Element param = doc.createElementNS(SLD_NAMESPACE, "CssParameter");
            param.setAttribute("name", name);
            param.setTextContent(value);
            element.appendChild(param);
        }
        return this;
    }

    /**
     * CssParameter 추가 (숫자)
     */
    public SldElementBuilder cssParam(String name, Number value) {
        if (value != null) {
            cssParam(name, String.valueOf(value));
        }
        return this;
    }

    /**
     * 부모로 이동 (체이닝용)
     */
    public SldElementBuilder parent() {
        Element parent = (Element) element.getParentNode();
        return new SldElementBuilder(doc, parent);
    }

    /**
     * 최종 Element 반환
     */
    public Element build() {
        return element;
    }

    /**
     * 현재 Document 반환
     */
    public Document getDocument() {
        return doc;
    }
}
