/*
 * Copyright (c) 2009 The openGion Project.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.opengion.hayabusa.io;

import java.util.List;
import java.awt.Color;
import org.opengion.hayabusa.common.HybsSystemException;		// 6.9.8.0 (2018/05/28)

import org.jfree.data.general.Dataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.MultiplePiePlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.RingPlot;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.chart.plot.PolarPlot;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.labels.StandardPieToolTipGenerator;

/**
 * ChartPlot_Pie は、ChartPlot インターフェースを継承した実体クラスです。
 * JFreeChart では、各種オブジェクトの組み合わせで、色々なグラフを作成できます。
 * チャートタイプが、複数種類存在するため、ここでは、特殊な方法として、各タイプ毎に
 * オブジェクトを構築しています。(ファクトリメソッド的な処理)
 *
 * @version  0.9.0	2007/06/21
 * @author	 Kazuhiko Hasegawa
 * @since	 JDK1.1,
 */
public class ChartPlot_Pie implements ChartPlot {

	/**
	 * デフォルトコンストラクター
	 *
	 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
	 */
	public ChartPlot_Pie() { super(); }		// これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。

	/**
	 * Plot オブジェクトを取得します。
	 *
	 * Plot オブジェクト には、その種類の応じた、データセットやレンデラーを
	 * 設定する必要があります。
	 * また、複数のデータセットや、それに関係する属性情報も、設定する必要が
	 * あります。
	 * Plot は、JFreeChart オブジェクトにつき、一つ用意しなければなりません。
	 * チャート合成時でも、Plot は一つです。
	 *
	 * @og.rev 5.3.0.0 (2010/12/01) 特殊プロットの追加
	 * @og.rev 5.7.8.0 (2014/07/04) MeterPlot 、Compass 、Thermometer の機能追加
	 * @og.rev 6.4.9.0 (2016/07/23) Pie,Pie3D,Ring に、色指定を追加。これらは、同じ設定が使えるので、マージします。
	 *
	 * @param	create	ChartCreateオブジェクト
	 *
	 * @return	Plotオブジェクト
	 */
	public Plot getPlot( final ChartCreate create ) {

		final List<ChartDataset> datasetList = create.getDatasetList();
		final ChartDataset chDataset = datasetList.get(0);

		final Dataset dtset = chDataset.getDataset();

		// クリッカブル・マップ
		final HybsURLGenerator urlGen = create.getURLGenerator();
		final boolean useToolTip = create.isUseToolTip();		// 4.9.9.9 (2009/08/07) メソッド名変更

		Plot plot = null;
		final String type = chDataset.getChartType();
		// 6.4.9.0 (2016/07/23) Pie,Pie3D,Ring は、同じ設定が使えるので、マージします。
		if( "Pie".equalsIgnoreCase( type ) || "Pie3D".equalsIgnoreCase( type ) || "Ring".equalsIgnoreCase( type ) ) {
			final PiePlot pplot ;
			switch( type ) {
				case "Pie"		: pplot = new PiePlot();	break;
				case "Pie3D"	: pplot = new PiePlot3D();	break;
				case "Ring"		: pplot = new RingPlot();	break;
				// 6.9.8.0 (2018/05/28) FindBugs:switch 文の2つの case のために同じコードを使用しているメソッド
//				default			: pplot = new PiePlot();	break;
				default  :
					// 先に、type を判定しているため、default には、分岐されない。
					final String errMsg = "何らかの要因で、ありえないエラーが発生しました。";
					throw new HybsSystemException( errMsg );
			}

			pplot.setDataset( (PieDataset)dtset );
			if( urlGen != null ) {
				pplot.setURLGenerator( urlGen );
			}
			if( useToolTip ){	// 4.3.1.0 (2008/08/09) ツールチップスの利用
				pplot.setToolTipGenerator( new StandardPieToolTipGenerator() );
			}

			// 6.4.9.0 (2016/07/23) 色指定の反映。indexが非推奨なので、キー指定に変更。
			final Color[] clrs = chDataset.getSeriesColors();
			if( clrs != null && clrs.length>0 ) {
				final int len = ((PieDataset)dtset).getItemCount();
				for( int i=0;i<clrs.length && i<len; i++ ) {
					final Comparable<?> key = ((PieDataset)dtset).getKey(i);
					pplot.setSectionPaint( key,clrs[i] );
				}
			}
			plot = pplot;
		}
		else if( "MultiplePie".equalsIgnoreCase( type ) ) {
			plot = new MultiplePiePlot();
			((MultiplePiePlot)plot).setDataset( (CategoryDataset)dtset );
		}
		else if( "SpiderWeb".equalsIgnoreCase( type ) ) {
			plot = new SpiderWebPlot();
			((SpiderWebPlot)plot).setDataset( (CategoryDataset)dtset );
			if( urlGen != null ) {
				((SpiderWebPlot)plot).setURLGenerator( urlGen );
			}
			if( useToolTip ){	// 4.3.1.0 (2008/08/09) ツールチップスの利用
				((SpiderWebPlot)plot).setToolTipGenerator( new StandardCategoryToolTipGenerator() );
			}

			// 6.4.9.0 (2016/07/23) 色指定の反映。
			final Color[] clrs = chDataset.getSeriesColors();
			if( clrs != null && clrs.length>0 ) {
				for( int i=0;i<clrs.length; i++ ) {
					((SpiderWebPlot)plot).setSeriesPaint( i,clrs[i] );
				}
			}
		}
	 	// 5.3.0.0 (2010/12/01) 特殊プロットの追加
		else if( "Polar".equalsIgnoreCase( type ) ) {
			plot = new PolarPlot();
			((PolarPlot)plot).setDataset( (XYDataset)dtset );
		}
		else if( "Meter".equalsIgnoreCase( type ) ) {
			// 5.7.8.0 (2014/07/04) 機能追加
			plot = chDataset.makeMeterPlot();
		}
		else if( "Thermometer".equalsIgnoreCase( type ) ) {
			// 5.7.8.0 (2014/07/04) 機能追加
			plot = chDataset.makeThermometerPlot();
		}
		else if( "Compass".equalsIgnoreCase( type ) ) {
			// 5.7.8.0 (2014/07/04) 機能追加
			plot = chDataset.makeCompassPlot();
		}

		return plot;
	}
}
