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

package jp.co.going.xbrl.instance;

import java.io.File;
import java.sql.Connection;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

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

import org.w3c.dom.Document;

/**
 * ＸＢＲＬインスタンスを生成するクラス
 *
 * @author Going Dot Com Inc.
 */
public class XbCreator {

    private XbInstance instance;
    private Connection conn;
    private Document doc;

    /**
     * コンストラクタ
     * @param conn SQLコネクション
     */
    public XbCreator(Connection conn) throws XbException {
        this.conn = conn;
    }

    /**
     * ＸＢＲＬインスタンスを生成する
     * @param taxGroupId タクソノミーグループID
     * @param contextIdList コンテキストIDリスト
     * @param refList 参照タグIDリスト
     * @param version インスタンス生成バージョン
     * @throws XbException
     */
    public void createInstance(String taxGroupId, XbContextIdList contextIdList, XbRefList refList, String version) throws XbException {
        // version判定
        if (version.equals(XbConstants.SPECIFICATION_NO_20)) {            // 2.0
            instance = new XbInstance20(this.conn);
        } else if (version.equals(XbConstants.SPECIFICATION_NO_21)) {    // 2.1
            instance = new XbInstance21(this.conn);
        }
        // instance作成
        doc = instance.createInstance(taxGroupId, contextIdList, refList);
    }

    /**
     * 作成したインスタンスをDocumentとして取得する
     * @return XBRLインスタンスドキュメント
     * @throws XbException
     */
    public Document getXbrlDocument() throws XbException {
        return doc;
    }

    /**
     * 作成したインスタンスをXBRLファイルとして生成する
     * @param fileName インスタンス出力ファイル名
     * @throws XbException
     */
    public void createXbrlFile(String fileName) throws XbException {
        try {
            // ファイル出力
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer transformer = tfactory.newTransformer();
            transformer.setOutputProperty(XbConstants.INDENT_VALUE, XbConstants.YES_VALUE);
            File outfile = new File(fileName);

            transformer.transform(new DOMSource(doc), new StreamResult(outfile.toString()));
        } catch (TransformerException e) {
            throw new XbException(e);
        }
    }
}