/*
 * このソースコードは blanco Frameworkにより自動生成されました。
 */
package blanco.sample.pdf.report;

import java.io.OutputStream;
import java.util.List;

import blanco.pdf.page.BlancoPdfPageUtil;
import blanco.pdf.page.BlancoPdfPageWriter;
import blanco.pdf.page.valueobject.BlancoPdfPageDef;
import blanco.pdf.valueobject.BlancoPdfSetting;
import blanco.sample.pdf.report.items.Tate01PdfReportItems;

import com.lowagie.text.pdf.PdfWriter;

/**
 * PDF レポート。
 */
public class Tate01PdfReport {
    /**
     * ページ定義オブジェクト。
     */
    private BlancoPdfPageDef fPageDef;

    /**
     * ページ・ライター・オブジェクト。
     */
    private BlancoPdfPageWriter fPageWriter;

    /**
     * 1 ページ分のデータをセットします。
     *
     * @param pdfSetting PDF 項目群。
     * @param outStream 出力ストリーム。
     */
    public Tate01PdfReport(final BlancoPdfSetting pdfSetting, final OutputStream outStream) {
        fPageDef = BlancoPdfPageUtil.read(pdfSetting, "tate01");
        fPageWriter = new BlancoPdfPageWriter(pdfSetting.getConfPath(), fPageDef, outStream);
    }

    /**
     * 1 ページ分のデータを PDF に書き出します。
     *
     * @param pdfItems PDF 項目群。
     */
    public void writeItems(final Tate01PdfReportItems pdfItems) {
    }

    /**
     * ページをすべて出力します。
     *
     * @param itemsList 出力したい項目群。
     */
    public void writeItemsList(final List<Tate01PdfReportItems> itemsList) {
        boolean isFirst = true;
        for (Tate01PdfReportItems items : itemsList) {
            if (isFirst) {
                isFirst = false;
            } else {
                nextPage();
            }
            writeItems(items);
        }
    }

    /**
     * 改ページします。
     */
    public void nextPage() {
        fPageWriter.nextPage();
    }

    /**
     * 正規化の実施。ページブレークなどの処理をおこないます。
     *
     * @param itemsList 正規化したい項目群。
     */
    public void normalize(final List<Tate01PdfReportItems> itemsList) {
        consolidatePage(itemsList);
        breakPageByRowCount(itemsList);
        processPageContinuity(itemsList);
        omitDitto(itemsList);

        // ページ関連情報の埋め込み。
        applyPageNo(itemsList);
    }

    /**
     * ページの集約処理をおこないます。すべての項目の値をもとに処理されるものです。
     *
     * @param itemsList ページ集約したい項目群。
     */
    public void consolidatePage(final List<Tate01PdfReportItems> itemsList) {
        Tate01PdfReportItems prev = null;
        for (int index = 0; index < itemsList.size(); index++) {
            final Tate01PdfReportItems next = itemsList.get(index);
            if (prev == null) {
                prev = next;
                continue;
            }

            // 項目の値を比較。
            if (canConsolidatePage(prev, next)) {
                // ページを集約します。
            } else {
                prev = next;
            }
        }
    }

    /**
     * ページ集約できるかどうかをチェック。
     *
     * @param prev 比較元。
     * @param next 比較先。
     * @return 集約できるかどうか。
     */
    public boolean canConsolidatePage(final Tate01PdfReportItems prev, final Tate01PdfReportItems next) {
        return true;
    }

    /**
     * 所定の行数をもとにページをブレークします。こちらではページを分割します。
     *
     * @param itemsList ブレーク処理したい項目群。
     */
    public void breakPageByRowCount(final List<Tate01PdfReportItems> itemsList) {
    }

    /**
     * ページの継続性に関する処理を実施します。
     *
     * @param itemsList 処理対象。
     */
    public void processPageContinuity(final List<Tate01PdfReportItems> itemsList) {
    }

    /**
     * ページ番号を付与。
     *
     * @param itemsList ページ処理したい項目群。
     */
    public void applyPageNo(final List<Tate01PdfReportItems> itemsList) {
    }

    /**
     * 同上項目の省略を実施。
     *
     * @param itemsList 省略処理をしたい項目群。
     */
    public void omitDitto(final List<Tate01PdfReportItems> itemsList) {
    }

    /**
     * グリッド・シートを描画します。
     */
    public void drawGridSheet() {
        fPageWriter.drawGridSheet();
    }

    /**
     * クローズします。
     */
    public void close() {
        fPageWriter.close();
    }

    /**
     * PDF ライターを取得します。
     *
     * @return 内部的に利用しているライター。
     */
    @Deprecated
    public PdfWriter getPdfWriter() {
        return fPageWriter.getWriter();
    }
}
