/***************************************
*                                      *
*              tyousei.c               *
*                                      *
*                                      *
***************************************/

#include <iostream>
#include <cstdlib>
#include <cmath>
#include "snaps.h"
#include "kiso.h"
#include "kisosu.h"
#include "econ.h"
#include "file_open.h"
#include "cntl.h"

void tyousei()
{
	int nendo;
	int nenrei;
	int c_nendo;
	int counter;
	double cut_ruiseki_a[SAISHUNENDO - ECON_SHONENDO + 1][MAX_JUKYU - NENREI_SUM + 1];
	double cut_ruiseki_b[SAISHUNENDO - ECON_SHONENDO + 1][MAX_JUKYU - NENREI_SUM + 1];
	double Kiso_Cut_Jisshitu[SAISHUNENDO - SHONENDO + 1];
	double Kiso_Cut[SAISHUNENDO - SHONENDO + 1];
	double Shishutu_Jisshitu[SAISHUNENDO - SHONENDO + 1];
	double Shishutu[SAISHUNENDO - SHONENDO + 1];
	
	using namespace std;
	
	// ゼロクリア
	for( nendo = SHONENDO ; nendo <= SAISHUNENDO ; nendo++ )
	{
		Kiso_Cut_Jisshitu[nendo - SHONENDO] = 0.;
		Kiso_Cut[nendo - SHONENDO] = 0.;
		Shishutu_Jisshitu[nendo - SHONENDO] = 0.;
		Shishutu[nendo - SHONENDO] = 0.;
	}
	
	// 保険料収入計算
	// 保険料
	for( nendo = KAISHI1 ; nendo <= h_nendo - 1 ; nendo++ )
	{
		Hokenryou_y[nendo - SHONENDO]
		 = ( Round( Hokenryou_m[nendo - 1 - SHONENDO][0] * kakaku[nendo - 1 - ECON_SHONENDO] , 1 )
		   + Round( Hokenryou_m[nendo - 1 - SHONENDO][1] * kakaku[nendo - 1 - ECON_SHONENDO] , 1 ) ) / 2.
		 * SanteiTaishou[KOKUNEN][nendo - 1 - SHONENDO][1]
		 + ( Round( Hokenryou_m[nendo - SHONENDO][0] * kakaku[nendo - ECON_SHONENDO] , 1 )
		   + Round( Hokenryou_m[nendo - SHONENDO][1] * kakaku[nendo - ECON_SHONENDO] , 1 ) ) / 2.
		 * SanteiTaishou[KOKUNEN][nendo - SHONENDO][1] * 11.;
	}
	
	Hokenryou_y[h_nendo - SHONENDO]
	 = ( Round( Hokenryou_m[h_nendo - 1 - SHONENDO][0] * kakaku[h_nendo - 1 - ECON_SHONENDO] , 1 )
	   + Round( Hokenryou_m[h_nendo - 1 - SHONENDO][1] * kakaku[h_nendo - 1 - ECON_SHONENDO] , 1 ) ) / 2.
	 * SanteiTaishou[KOKUNEN][h_nendo - 1 - SHONENDO][1]
	 + ( Hokenryou_m[h_nendo - SHONENDO][0] + Hokenryou_m[h_nendo - SHONENDO][1] ) / 2. * kakaku[h_nendo - ECON_SHONENDO]
	 * SanteiTaishou[KOKUNEN][h_nendo - SHONENDO][1] * 11.;
	
	for( nendo = h_nendo + 1 ; nendo <= SAISHUNENDO ; nendo++ )
	{
		Hokenryou_y[nendo - SHONENDO]
		 = ( Hokenryou_m[nendo - 1 - SHONENDO][0] + Hokenryou_m[nendo - 1 - SHONENDO][1] ) / 2. * kakaku[nendo - 1 - ECON_SHONENDO]
		 * SanteiTaishou[KOKUNEN][nendo - 1 - SHONENDO][1]
		 + ( Hokenryou_m[nendo - SHONENDO][0] + Hokenryou_m[nendo - SHONENDO][1] ) / 2. * kakaku[nendo - ECON_SHONENDO]
		 * SanteiTaishou[KOKUNEN][nendo - SHONENDO][1] * 11.;
	}
	
	// 付加年金
	for( nendo = KAISHI1 ; nendo <= SAISHUNENDO ; nendo++ )
	{
		Fuka_Hokenryou_y[nendo - SHONENDO]
		 = Fuka_Hokenryou_m[nendo - 1 - SHONENDO] * Fuka_Ninzu[nendo - 1 - SHONENDO]
		 + Fuka_Hokenryou_m[nendo - SHONENDO] * Fuka_Ninzu[nendo - SHONENDO] * 11.;
	}
	
	// 積立金の計算
	for( nendo = KAISHI1 ; nendo <= SAISHUNENDO ; nendo++ )
	{
		Tumitate[nendo - SHONENDO]
		 = Tumitate[nendo - 1 - SHONENDO] * interest_rate[nendo - ECON_SHONENDO]
		 + ( Hokenryou_y[nendo - SHONENDO]
		   + Fuka_Hokenryou_y[nendo - SHONENDO] - Kyoshutukin[KOKUNEN][nendo - SHONENDO][NENREI_SUM - NENREI_SUM][SUM]
		   + Kyoshutukin_Kokko[KOKUNEN][nendo - SHONENDO][NENREI_SUM - NENREI_SUM][SUM]
		   - Fukushi[nendo - SHONENDO]
		   - Ichijikin[nendo - SHONENDO][NOUFU] - Ichijikin[nendo - SHONENDO][FUKA] * 3. / 4.
		   - Kafu[nendo - SHONENDO][NEW]
		   - Kafu[nendo - SHONENDO][OLD_NOUFU]
		   - Fuka[nendo - SHONENDO][SUM] * 3. / 4.
		   + Yuushi_Saiken[nendo - SHONENDO] )
		 * pow( interest_rate[nendo - ECON_SHONENDO] , 1. / 2. );
		
		//妻積
		if( nendo >= TUMATUMI_NENDO )
 		{
			Tumitate[nendo - SHONENDO]
			 += Tumatumi[KOKUNEN][nendo - SHONENDO]
			    * pow( interest_rate[nendo - ECON_SHONENDO] , ( nendo == TUMATUMI_NENDO ? 2. / 12. : 1. / 2.) );
		}
	}
	
	// 給付水準調整後改定率
	for( nendo = ECON_SHONENDO ; nendo <= SAISHUNENDO ; nendo++ )
	{
		for( nenrei = UNDER_67 ; nenrei <= MAX_JUKYU ; nenrei++ )
		{
			kaiteiritu_cut[nendo - ECON_SHONENDO][nenrei - UNDER_67] = kaiteiritu[nendo - ECON_SHONENDO][nenrei - UNDER_67];
		}
	}
	
	// 給付水準調整終了年度の決定
	// 給付水準調整後の給付費等
	for( c_nendo = C_NENDO + 1 ; c_nendo <= T_NENDO ; c_nendo++ )
	{
		// 給付水準調整後の改定率
		for( nenrei = UNDER_67 ; nenrei <= MAX_JUKYU ; nenrei++ )
		{
			kaiteiritu_cut[c_nendo - ECON_SHONENDO][nenrei - UNDER_67]
			 = kaiteiritu[c_nendo - ECON_SHONENDO][nenrei - UNDER_67] / pre_cut[c_nendo - ECON_SHONENDO][nenrei - UNDER_67];
		}
		
		// 給付水準調整後の拠出金等
		Atamawari_cut( c_nendo );
		
		for( nendo = KAISHI1 ; nendo <= T_NENDO ; nendo++ )
		{
			Kiso_Cut_Jisshitu[nendo - SHONENDO]
			 = Kyoshutukin_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM] - Kyoshutukin_Kokko_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM];
			Kiso_Cut[nendo - SHONENDO]
			 = Kyoshutukin_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM] + Tokubetukokko_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM][SUM][SUM];
			
			Shishutu_Jisshitu[nendo - SHONENDO]
			 = Kiso_Cut_Jisshitu[nendo - SHONENDO]
			 + Ichijikin[nendo - SHONENDO][NOUFU] + Ichijikin[nendo - SHONENDO][FUKA] * 3. / 4.
			 + Kafu_Cut[nendo - SHONENDO][NEW] + Kafu_Cut[nendo - SHONENDO][OLD_NOUFU]
			 + Fukushi[nendo - SHONENDO]
			 + Fuka[nendo - SHONENDO][SUM] * 3. / 4.;
			
			Shishutu[nendo - SHONENDO]
			 = Kiso_Cut[nendo - SHONENDO] + Ichijikin[nendo - SHONENDO][SUM] + Kafu_Cut[nendo - SHONENDO][SUM]
			 + Fukushi[nendo - SHONENDO] + Fuka[nendo - SHONENDO][SUM];
			
			Tumitate[nendo - SHONENDO]
			 = Tumitate[nendo - 1 - SHONENDO] * interest_rate[nendo - ECON_SHONENDO]
			 + ( Hokenryou_y[nendo - SHONENDO] + Fuka_Hokenryou_y[nendo - SHONENDO]
			   - Shishutu_Jisshitu[nendo - SHONENDO] + Yuushi_Saiken[nendo - SHONENDO] )
			 * pow( interest_rate[nendo - ECON_SHONENDO] , 1. / 2. );
			
			if( nendo == TUMATUMI_NENDO )
 			{
				Tumitate[nendo - SHONENDO]
				 += Tumatumi[KOKUNEN][nendo - SHONENDO] * pow( interest_rate[nendo - ECON_SHONENDO] , 2. / 12. );
			}
			else if( nendo > TUMATUMI_NENDO )
 			{
				Tumitate[nendo - SHONENDO]
				 += Tumatumi[KOKUNEN][nendo - SHONENDO] * pow( interest_rate[nendo - ECON_SHONENDO] , 1. / 2. );
			}
		}
		
		// 次年度に給付水準を調整するか否かの判定
		if( Tumitate[T_NENDO - 1 - SHONENDO] < Shishutu[T_NENDO - SHONENDO] * T_DOAI )
		{
			if( c_nendo >= T_NENDO )
			{
				cout << "調整できません" << endl;
				break;
			}
		}
		else
		{
			break;
		}
	}
	
	S_C_NENDO = c_nendo;
	
	cout << "マクロ経済スライド終了年度 " << S_C_NENDO << endl;
	
	for( nenrei = NENREI_SUM ; nenrei <= MAX_JUKYU ; nenrei++ )
	{
		for( nendo = KAISHI1 ; nendo <= SAISHUNENDO ; nendo++ )
		{
			cut_ruiseki_b[nendo - ECON_SHONENDO][nenrei - NENREI_SUM]
			 = cut_ruiseki[S_C_NENDO - ECON_SHONENDO][nendo - ECON_SHONENDO][nenrei - NENREI_SUM];
			
			cut_ruiseki_a[nendo - ECON_SHONENDO][nenrei - NENREI_SUM]
			 = cut_ruiseki[S_C_NENDO - 1 - ECON_SHONENDO][nendo - ECON_SHONENDO][nenrei - NENREI_SUM];
		}
	}
	
	counter = 1;
	
	while( counter <= 128 )
	{
		for( nenrei = NENREI_SUM ; nenrei <= MAX_JUKYU ; nenrei++ )
		{
			for( nendo = KAISHI1 ; nendo <= SAISHUNENDO ; nendo++ )
			{
				cut_ruiseki[S_C_NENDO - ECON_SHONENDO][nendo - ECON_SHONENDO][nenrei - NENREI_SUM]
				 = ( cut_ruiseki_a[nendo - ECON_SHONENDO][nenrei - NENREI_SUM] + cut_ruiseki_b[nendo - ECON_SHONENDO][nenrei - NENREI_SUM] ) / 2.;
			}
		}
		
		// 給付水準調整後改定率
		for( nenrei = UNDER_67 ; nenrei <= MAX_JUKYU ; nenrei++ )
		{
			kaiteiritu_cut[S_C_NENDO - ECON_SHONENDO][nenrei - UNDER_67]
			 = kaiteiritu[S_C_NENDO - ECON_SHONENDO][nenrei - UNDER_67]
			 * cut_ruiseki[S_C_NENDO - ECON_SHONENDO][S_C_NENDO - ECON_SHONENDO][nenrei - NENREI_SUM]
			 / cut_ruiseki[S_C_NENDO - 1 - ECON_SHONENDO][S_C_NENDO - ECON_SHONENDO][nenrei - NENREI_SUM];
		}
		
		// 給付水準調整後の拠出金等
		Atamawari_cut( S_C_NENDO );
		
		for( nendo = KAISHI1 ; nendo <= SAISHUNENDO ; nendo++ )
		{
			Kiso_Cut_Jisshitu[nendo - SHONENDO]
			 = Kyoshutukin_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM] - Kyoshutukin_Kokko_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM];
			
			Kiso_Cut[nendo - SHONENDO]
			 = Kyoshutukin_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM] + Tokubetukokko_Cut[nendo - SHONENDO][NENREI_SUM - NENREI_SUM][SUM][SUM];
			
			Shishutu_Jisshitu[nendo - SHONENDO]
			 = Kiso_Cut_Jisshitu[nendo - SHONENDO]
			 + Ichijikin[nendo - SHONENDO][NOUFU] + Ichijikin[nendo - SHONENDO][FUKA] * 3. / 4.
			 + Kafu_Cut[nendo - SHONENDO][NEW] + Kafu_Cut[nendo - SHONENDO][OLD_NOUFU]
			 + Fukushi[nendo - SHONENDO]
			 + Fuka[nendo - SHONENDO][SUM] * 3. / 4.;
			
			Shishutu[nendo - SHONENDO]
			 = Kiso_Cut[nendo - SHONENDO] + Ichijikin[nendo - SHONENDO][0] + Kafu_Cut[nendo - SHONENDO][0]
			 + Fukushi[nendo - SHONENDO] + Fuka[nendo - SHONENDO][SUM];
			
			Tumitate[nendo - SHONENDO]
			 = Tumitate[nendo - 1 - SHONENDO] * interest_rate[nendo - ECON_SHONENDO]
			 + ( Hokenryou_y[nendo - SHONENDO] + Fuka_Hokenryou_y[nendo - SHONENDO]
			   - Shishutu_Jisshitu[nendo - SHONENDO] + Yuushi_Saiken[nendo - SHONENDO] )
 			 * pow( interest_rate[nendo - ECON_SHONENDO] , 1. / 2. );
 			
 			if( nendo == TUMATUMI_NENDO )
 			{
				Tumitate[nendo - SHONENDO] += Tumatumi[KOKUNEN][nendo - SHONENDO] * pow( interest_rate[nendo - ECON_SHONENDO] , 2. / 12. );
			}
			else if( nendo > TUMATUMI_NENDO )
 			{
				Tumitate[nendo - SHONENDO] += Tumatumi[KOKUNEN][nendo - SHONENDO] * pow( interest_rate[nendo - ECON_SHONENDO] , 1. / 2. );
			}
		}
		
		if( Tumitate[T_NENDO - 1 - SHONENDO] < Shishutu[T_NENDO - SHONENDO] * T_DOAI )
		{
			for( nenrei = NENREI_SUM ; nenrei <= MAX_JUKYU ; nenrei++ )
			{
				for( nendo = KAISHI1 ; nendo <= SAISHUNENDO ; nendo++ )
				{
					cut_ruiseki_a[nendo - ECON_SHONENDO][nenrei - NENREI_SUM]
					 = cut_ruiseki[S_C_NENDO - ECON_SHONENDO][nendo - ECON_SHONENDO][nenrei - NENREI_SUM];
				}
			}
		}
		else
		{
			for( nenrei = NENREI_SUM ; nenrei <= MAX_JUKYU ; nenrei++ )
			{
				for( nendo = KAISHI1 ; nendo <= SAISHUNENDO ; nendo++ )
				{
					cut_ruiseki_b[nendo - ECON_SHONENDO][nenrei - NENREI_SUM]
					 = cut_ruiseki[S_C_NENDO - ECON_SHONENDO][nendo - ECON_SHONENDO][nenrei - NENREI_SUM];
				}
			}
		}
		counter++;
	}
	
	// 給付水準調整後の改定率を新たに改定率とする
	for( nendo = ECON_SHONENDO ; nendo <= SAISHUNENDO ; nendo++ )
	{
		for( nenrei = UNDER_67 ; nenrei <= MAX_JUKYU ; nenrei++ )
		{
			kaiteiritu[nendo - ECON_SHONENDO][nenrei - UNDER_67] = kaiteiritu_cut[nendo - ECON_SHONENDO][nenrei - UNDER_67];
		}
	}
}
