import java.util.Hashtable;

import jp.co.prism.xrf.accessor.MakeJobFileException;
import jp.co.prism.xrf.accessor.XRFApi;
import jp.co.prism.xrf.accessor.XRFApiConfig;
import jp.co.prism.xrf.accessor.XRFApiException;


/**
 * このプログラムは、XRFApiの帳票生成とジョブファイル生成のサンプルプログラムです。
 */
public class XRFApiSample {


    public static void main( String[] args ) {

        // XRFApi#makeReport
        sample1();

        // XRFApi#makeReport
        sample2();

        // XRFApi#makeReport
        sample3();

        // XRFApi#makePrintJobFile
        sample4();

        // XRFApi#makePrintJobFile
        sample5();

        // XRFApi#makePrintJobFile
        sample6();

        System.exit(0);
    }


    /**
     * 同じXPFとユーザデータから、XRFファイルとPDFファイルを生成します。
     */
    static void sample1(){

        try {
            // 環境毎のXRFApiインスタンスを生成
            XRFApi api = XRFApiConfig.getInstance( "../conf/conf.xml" );


            // ****************
            // *  入力データ
            // ****************
            // 帳票オーバレイ、XPFファイル
            String xpfFile = "../data/XPF/Sample_A01_CardType.xpf";

            // ユーザデータ、XMLファイル
            String userData = "../data/XML/Sample_A01_CardType.xml";

            // 帳票生成パラメータ
            Hashtable params = new Hashtable() ;


            // *****************
            // *  XRF を生成
            // *****************
            // 出力モードをXRFに設定する。
            params.put( XRFApiConfig.OUTPUTMODE, XRFApiConfig.OUTPUTMODE_XRF );

            //出力先、XRFファイル
            String xrfFile = "../output/XRF/Sample_A01_CardType.xrf";

            // XRF 生成
            api.makeReport( xpfFile, userData, params, xrfFile );


            // *****************
            // *  PDF を生成
            // *****************
            //出力モードをPDFに設定する。
            params.put( XRFApiConfig.OUTPUTMODE, XRFApiConfig.OUTPUTMODE_PDF );

            //出力先、PDFファイル
            String pdfFile = "../output/PDF/Sample_A01_CardType.pdf";

            // PDF 生成
            api.makeReport( xpfFile, userData, params, pdfFile );

        }
        catch ( XRFApiException e ) {
            e.printStackTrace();
        }
    }


    /**
     * ダイナミックオーバレイでXRFを生成
     */
    static void sample2(){

        try {
            //環境毎のXRFApiインスタンスを生成
            XRFApi api = XRFApiConfig.getInstance( "../conf/conf.xml" );

            // ****************
            // *  入力データ
            // ****************
            // 帳票オーバレイ、XPFファイル
            String[] xpfFiles = new String[]{
                    "../data/XPF/Sample_A01_CardType.xpf",
                    "../data/XPF/Sample_A02_DenpyoType_1.xpf",
                    "../data/XPF/Sample_A03_DenpyoType_2.xpf",
                    "../data/XPF/Sample_A04_DenpyoType_3.xpf",
                    "../data/XPF/Sample_A05_ListType.xpf"
            };

            // ユーザデータ、XMLファイル
            String[] userData = new String[]{
                    "../data/XML/Sample_A01_CardType.xml",
                    "../data/XML/Sample_A02_DenpyoType_1.xml",
                    "../data/XML/Sample_A03_DenpyoType_2.xml",
                    "../data/XML/Sample_A04_DenpyoType_3.xml",
                    "../data/XML/Sample_A05_ListType.xml"
            };

            // 帳票生成パラメータ
            Hashtable[] params = new Hashtable[5];
            params[0] = new Hashtable();
            params[1] = new Hashtable();
            params[2] = new Hashtable();
            params[3] = new Hashtable();
            params[4] = new Hashtable();
            // 出力モードをXRFに設定する。
            params[0].put( XRFApiConfig.OUTPUTMODE, XRFApiConfig.OUTPUTMODE_XRF );
            // XRFファイルの印刷用紙サイズを指定する
            params[0].put( XRFApiConfig.PRINTSIZE, XRFApiConfig.PRINTSIZE_A4 );
            params[1].put( XRFApiConfig.PRINTSIZE, XRFApiConfig.PRINTSIZE_B5 );
            params[2].put( XRFApiConfig.PRINTSIZE, XRFApiConfig.PRINTSIZE_A4 );
            params[3].put( XRFApiConfig.PRINTSIZE, XRFApiConfig.PRINTSIZE_A4 );
            params[4].put( XRFApiConfig.PRINTSIZE, XRFApiConfig.PRINTSIZE_A3 );

            //出力先、XRFファイル
            String outputFile = "../output/XRF/XRFApiSample2.xrf";

            // XRF 生成
            api.makeReport( xpfFiles, userData, params, outputFile ) ;

        } catch ( XRFApiException e ) {
            e.printStackTrace();
        }
    }


    /**
     * 連続でXRFファイルとPDFファイルを生成します。
     */
    static void sample3(){

        try {
            // 環境毎のXRFApiインスタンスを生成
            XRFApi api = XRFApiConfig.getInstance( "../conf/conf.xml" );

            // 帳票オーバレイ、XPFファイル
            String[] xpfFiles = {
                    "Sample_A01_CardType.xpf",
                    "Sample_A02_DenpyoType_1.xpf",
                    "Sample_A03_DenpyoType_2.xpf",
                    "Sample_A04_DenpyoType_3.xpf",
                    "Sample_A05_ListType.xpf",
                    "Sample_A06_LabelType_1.xpf",
                    "Sample_A07_LabelType_2.xpf",
                    "Sample_B01_BukkenJoho.xpf",
                    "Sample_B02_Graph.xpf",
                    "Sample_B04_Nouhin.xpf",
                    "Sample_B05_Nouhin_Cycle.xpf"
            };

            // ユーザデータ、XMLファイル
            String[] userDatas = {
                    "Sample_A01_CardType.xml",
                    "Sample_A02_DenpyoType_1.xml",
                    "Sample_A03_DenpyoType_2.xml",
                    "Sample_A04_DenpyoType_3.xml",
                    "Sample_A05_ListType.xml",
                    "Sample_A06_LabelType_1.xml",
                    "Sample_A07_LabelType_2.xml",
                    "Sample_B01_BukkenJoho.xml",
                    "Sample_B02_Graph.xml",
                    "Sample_B04_Nouhin.xml",
                    "Sample_B05_Nouhin_Cycle.xml"
            };

            // ユーザデータ、XMLファイル
            String[] reportFiles = {
                    "Sample_A01_CardType",
                    "Sample_A02_DenpyoType_1",
                    "Sample_A03_DenpyoType_2",
                    "Sample_A04_DenpyoType_3",
                    "Sample_A05_ListType",
                    "Sample_A06_LabelType_1",
                    "Sample_A07_LabelType_2",
                    "Sample_B01_BukkenJoho",
                    "Sample_B02_Graph",
                    "Sample_B04_Nouhin",
                    "Sample_B05_Nouhin_Cycle"
            };

            // 帳票生成パラメータ
            Hashtable params = new Hashtable() ;

            // 生成
            for( int i = 0; i < xpfFiles.length; i++ ){

                String xpfFile  = "../data/XPF/" + xpfFiles[i];
                String userData = "../data/XML/" + userDatas[i];
                String xrfFile = "../output/XRF/" + reportFiles[i] + ".xrf";
                String pdfFile = "../output/PDF/" + reportFiles[i] + ".pdf";

                // XRF 生成
                params.put( XRFApiConfig.OUTPUTMODE, XRFApiConfig.OUTPUTMODE_XRF );
                // XRFファイルに印刷ジョブ名をセットします。
                params.put( XRFApiConfig.JOBNAME, reportFiles[i] );
                api.makeReport( xpfFile, userData, params, xrfFile );

                // PDF 生成
                params.put( XRFApiConfig.OUTPUTMODE, XRFApiConfig.OUTPUTMODE_PDF );
                api.makeReport( xpfFile, userData, params, pdfFile );
            }

        } catch ( XRFApiException e ) {
            e.printStackTrace();
        }
    }


    /**
     * 複数のXRFファイルから、ジョブファイルを生成します。
     */
    static void sample4(){

        try {
            // 環境毎のXRFApiインスタンスを生成
            XRFApi api = XRFApiConfig.getInstance( "../conf/conf.xml" );

            // XRFファイル
            String[] xrfFiles = {
                    "../output/XRF/Sample_A01_CardType.xrf",
                    "../output/XRF/Sample_A02_DenpyoType_1.xrf",
                    "../output/XRF/Sample_A03_DenpyoType_2.xrf"
            };

            // ジョブファイル生成出力先
            String jobFile = "../output/XJF/PrintJob1.xjf";

            // **********************
            // *  ジョブファイルの生成
            // **********************
            api.makePrintJobFile( xrfFiles, jobFile );

        }
        catch (MakeJobFileException e) {
            e.printStackTrace();
        }
        catch (XRFApiException e) {
            e.printStackTrace();
        }
    }


    /**
     * ジョブファイル生成パラメータで名前属性などを指定し、ジョブファイルを生成します。
     */
    static void sample5(){

        try {
            // 環境毎のXRFApiインスタンスを生成
            XRFApi api = XRFApiConfig.getInstance( "../conf/conf.xml" );

            // XRFファイル
            String[] xrfFiles = {
                    "../output/XRF/Sample_A01_CardType.xrf",
                    "../output/XRF/Sample_A02_DenpyoType_1.xrf",
                    "../output/XRF/Sample_A03_DenpyoType_2.xrf"
            };

            // ジョブファイル生成パラメータ
            Hashtable jobfileParam = new Hashtable();

            // ジョブファイルの名前属性をセットする（File名ではありません）
            jobfileParam.put( XRFApiConfig.JOBFILE_NAME_KEY, "JobName" );

            // ジョブファイルのログレポートのレベルをデバッグに設定
            jobfileParam.put( XRFApiConfig.JOBFILE_CLIENT_LOGREPORT_LEVEL_KEY,
                    XRFApiConfig.JOBFILE_CLIENT_LOGREPORT_LEVEL_DEBUG );

            // ジョブファイルの拡張情報をセット（ログレポートで出力される）
            jobfileParam.put( XRFApiConfig.JOBFILE_EXTINFO_KEY_PREFIX+"COMMENT",
                    "maked by XRF Composer samplecode." );

            // ジョブファイル生成出力先
            String jobFile = "../output/XJF/PrintJob2.xjf";

            // **********************
            // **  ジョブファイルの生成
            // **********************
            api.makePrintJobFile( xrfFiles, jobfileParam, jobFile );

        }
        catch (MakeJobFileException e) {
            e.printStackTrace();
        }
        catch (XRFApiException e) {
            e.printStackTrace();
        }
    }


    /**
     * 帳票生成データから、XRFを生成し、ジョブファイルを生成します。
     */
    static void sample6(){

        try {
            // 環境毎のXRFApiインスタンスを生成
            XRFApi api = XRFApiConfig.getInstance( "../conf/conf.xml" );

            // ****************
            // *  帳票生成データ
            // ****************
            // XPFファイル
            String[] xpfFiles = {
                    "../data/XPF/Sample_A01_CardType.xpf",
                    "../data/XPF/Sample_A02_DenpyoType_1.xpf",
                    "../data/XPF/Sample_A03_DenpyoType_2.xpf"
            };
            // ユーザデータファイル
            String[] userdata = {
                    "../data/XML/Sample_A01_CardType.xml",
                    "../data/XML/Sample_A02_DenpyoType_1.xml",
                    "../data/XML/Sample_A03_DenpyoType_2.xml"
            };

            // 帳票生成パラメータ
            Hashtable params = new Hashtable() ;
            params.put( XRFApiConfig.OUTPUTMODE, XRFApiConfig.OUTPUTMODE_XRF );
            Hashtable[] reportParams = { params, params, params };

            // 出力先
            String jobFile = "../output/XJF/PrintJob3.xjf";

            // **********************
            // *  帳票の生成 ＆
            // *  ジョブファイルの生成
            // **********************
            api.makePrintJobFile( xpfFiles, userdata, reportParams, jobFile );

        }
        catch (MakeJobFileException e) {
            e.printStackTrace();
        }
        catch (XRFApiException e) {
            e.printStackTrace();
        }
    }

}
