/*
 * Copyright (c) 2007, Going Dot Com Inc. All rights reserved.
 */

package jp.co.going.xbrl.instance;

import java.util.ArrayList;

import jp.co.going.xbrl.common.XbException;
import jp.co.going.xbrl.common.XbConstants;

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

/**
 * @author Going Dot Com Inc.
 */
class XbContext {

    protected XbContextObj contextObj;

    protected XbEtcDAO etcDAO;

    /**
     * タグを作成する
     * @param doc ドキュメント
     * @param name タグ名
     * @return タグ名
     */
    protected Element createElement(Document doc, String name) {
        return doc.createElement(name);
    }

    /**
     * 属性を設定する
     * @param element 要素
     * @param list 属性リスト
     */
    private void setAttribute(Element element, ArrayList<XbEtcAttrObj> list) {
        for (int i = 0;i < list.size();i ++) {
            XbEtcAttrObj obj = list.get(i);
            this.setAttribute(element, obj.getEtcAttrName(), obj.getEtcAttrValue());
        }
    }

    /**
     * 属性を設定する
     * @param element タグ
     * @param name 属性名
     * @param value 属性値
     */
    protected void setAttribute(Element element, String name, String value) {
        element.setAttribute(name, value);
    }

    /**
     * テキストノードを設定する
     * @param element タグ
     * @param doc ドキュメント
     * @param value テキストノード
     */
    protected void appendChild(Element element, Document doc, String value) {
        if (value != null && !"".equals(value)) {
            element.appendChild(doc.createTextNode(value));
        }
    }

    /**
     * 親タグに子ノードを追加する
     * @param element 親タグ
     * @param node 子ノード
     */
    protected void appendChild(Element element, Node node) {
        if (node != null) {
            element.appendChild(node);
        }
    }

    /**
     * 接頭辞付の要素を作成する
     * @param prefix 接頭辞
     * @param name 名前
     * @return タグ
     */
    protected String addEtcStr(String prefix, String name) {
        StringBuffer str = new StringBuffer();
        str.append(prefix);
        str.append(XbConstants.COLON_TYPE);
        str.append(name);

        return str.toString();
    }

    /**
     * 各要素を作成する
     * @param doc ドキュメント
     * @param mainId 各種ID
     * @param obj オブジェクト
     * @param prefix 接頭辞
     * @param name 名前
     * @return 要素
     * @throws XbException
     */
    protected Element createEtc(Document doc, String mainId, XbEtcObj obj, String prefix) throws XbException {
        // 子要素取得
        ArrayList<XbEtcObj> etcList = etcDAO.getEtc(mainId, obj.getEtcId());
        Element etcItem = this.createElement(doc, this.addEtcStr(prefix, obj.getName()));

        if (etcList.size() == 0) {
            this.setAttribute(etcItem, obj.getAttrList());
            this.appendChild(etcItem, doc, obj.getValue());
        } else {
            this.setAttribute(etcItem, obj.getAttrList());

            for (int i = 0;i < etcList.size();i ++) {
                XbEtcObj etcObj = etcList.get(i);
                Element item = this.createEtc(doc, mainId, etcObj, prefix);
                this.appendChild(etcItem, item);
            }
        }

        return etcItem;
    }

    protected void createContext() throws XbException {}
}