package jp.co.nri.rid.search;

/* misc */
import java.util.Enumeration;
import java.util.Vector;

/* Rid */
import jp.co.nri.Rid;
import jp.co.nri.rid.xml.elementBooster;


/**
 * サイト統計を集計する
 */
class SPTableModelStatistics extends SPTableModel{
    /** SCCS ID */
    private static final String SCCSID = "@(#)SPTableModelStatistics.java";

    /** RCS ID */
    private static final String RCSID =
	"$Id: SPTableModelStatistics.java,v 1.3 2003-07-03 19:09:11+09 nsmr Exp $";

    /**
     * サイトレポートの対象となるユニット
     *
     * {ドキュメント, ユニット名, サイズ計算フラグ, 内訳表示フラグ} の配列
     */
    final Object[][] STAT_TARGET_UNITS = {
	{Rid.DOCUMENT_SITE, "ZoneUnit"},
	{Rid.DOCUMENT_SITE, "PageUnit", BTRUE, BTRUE},
	{Rid.DOCUMENT_SITE, "UrlUnit"},
	{Rid.DOCUMENT_DOCUMENT, "DocumentUnit", BTRUE, BTRUE},
	{Rid.DOCUMENT_RESOURCE, "ResourceUnit", BTRUE, BTRUE}
    };

    /** 内訳表示の際のインデント */
    static final String INDENT = "   ";

    /**
     * コンストラクタ:
     */
    SPTableModelStatistics() {
        target = SPTableModel.STATISTICS;
        count = -1;

        resultVector = new Vector();

        /** 1 行分のデータを含む文字列の配列 */
        String[] rowStrings;

        int[] columnIDs = SPColumnNames.get(target);
        if (columnIDs == null){
            return;
        }

        for (int i = 0; i < STAT_TARGET_UNITS.length; i++) {
            if (STAT_TARGET_UNITS[i] == null){
                continue;
            }
            if (STAT_TARGET_UNITS[i].length <= 1){
                continue;
            }

            String unitName = (String)STAT_TARGET_UNITS[i][1];

            /* unitName に該当するユニットをすべて取得する */
            elementBooster[] elements =
                getElementsFromDocument(unitName,
                                        (String)STAT_TARGET_UNITS[i][0]);

            int unitCount = 0;
            if (elements != null) {
                unitCount = elements.length;
                /* "_top" ゾーンの分を除く */
                if (unitName.equals("ZoneUnit") && unitCount >= 1) {
                    unitCount--;
                }
            }

            int totalSize = 0;
            /* 合計サイズ計算 */
            if (STAT_TARGET_UNITS[i].length >= 3 &&
                ((Boolean)STAT_TARGET_UNITS[i][2]).booleanValue()) {
                totalSize = getTotalSize(elements);
            }

            rowStrings = new String[columnIDs.length];
            SPResource r = SPResourceHash.get(unitName);
            if (r != null) {
                unitName = r.displayStr;
            }

            for (int j = 0; j < columnIDs.length; j++) {
                if (columnIDs[j] == SPColumnNames.UNIT) {
                    rowStrings[j] = unitName;
                } else if (columnIDs[j] == SPColumnNames.COUNT) {
                    rowStrings[j] = String.valueOf(unitCount);
                } else if (columnIDs[j] == SPColumnNames.TOTAL) {
                    rowStrings[j] = String.valueOf(totalSize);
                } else {
                    rowStrings[j] = null;
                }
            }

            /* 結果の表示 */
            resultVector.add(new SPElementAndStrings(rowStrings));

            /* 要素が空の場合は、ファイルタイプごとの集計を行なわない */
            if (elements == null) {
                continue;
            }

            /* ファイルタイプごとの集計 */
            if (STAT_TARGET_UNITS[i].length >= 4 &&
                ((Boolean)STAT_TARGET_UNITS[i][3]).booleanValue()) {
                SPFileTypeHash fileTypeHash = new SPFileTypeHash(elements);
                Enumeration e = fileTypeHash.keys();
                while (e.hasMoreElements()) {
                    String fileType = (String)e.nextElement();
                    /* "not exist" は後回し */
                    if (fileType.equals("not exist")) {
                        continue;
                    }
                    unitCount = fileTypeHash.getCount(fileType);
                    if (unitCount > 0) {
                        rowStrings = new String[columnIDs.length];
                        unitName = INDENT + "(" + fileType + ")";
                        totalSize = fileTypeHash.getSize(fileType);
                        for (int j = 0; j < columnIDs.length; j++) {
                            if (columnIDs[j] == SPColumnNames.UNIT) {
                                rowStrings[j] = unitName;
                            } else if (columnIDs[j] == SPColumnNames.COUNT) {
                                rowStrings[j] = String.valueOf(unitCount);
                            } else if (columnIDs[j] == SPColumnNames.TOTAL) {
                                rowStrings[j] = String.valueOf(totalSize);
                            } else {
                                rowStrings[j] = null;
                            }
                        }
                        resultVector.add(new SPElementAndStrings(rowStrings));
                    }
                }

                /* 後回しにされた "not exist"を、
                 * resultVector の最後に追加する
                 */
                unitCount = fileTypeHash.getCount("not exist");
                if (unitCount > 0) {
                    rowStrings = new String[columnIDs.length];
                    unitName = INDENT + "(not exist)";
                    for (int j = 0; j < columnIDs.length; j++) {
                        if (columnIDs[j] == SPColumnNames.UNIT) {
                            rowStrings[j] = unitName;
                        } else if (columnIDs[j] == SPColumnNames.COUNT) {
                            rowStrings[j] = String.valueOf(unitCount);
                        } else {
                            rowStrings[j] = null;
                        }
                    }
                    resultVector.add(new SPElementAndStrings(rowStrings));
                }
            }/* if (STAT_TARGET_UNITS[i].length >= 4 &&
                ((Boolean)STAT_TARGET_UNITS[i][3]).booleanValue()) */
        } /* for (int i = 0; i < STAT_TARGET_UNITS.length; i++) */
    } /* コンストラクタ */


    /**
     * 合計サイズの計算
     * @param elements 集計するエレメントの配列
     * @return 合計サイズ [バイト]
     */
    public int getTotalSize(elementBooster[] elements) {
        int totalSize = 0;

        if (elements == null) {
            return totalSize;
        }

        for (int i = 0; i < elements.length; i++) {
            String exist = elements[i].attribute("Exist");

            /* 存在しないエレメントはカウントしない */
            if (exist == null) {
                continue;
            }
            if (!exist.equals("true")) {
                continue;
            }
		
            String size = elements[i].attribute("Size");
            if (size != null) {
                int sizeInt;
                try {
                    sizeInt = Integer.parseInt(size);
                } catch (NumberFormatException e) {
                    sizeInt = 0;
                }
                totalSize += sizeInt;
            }
        }
        return totalSize;
    } /* getTotalSize */
} /* class SPTableModelStatistics */
