#include <iostream>
#include <cstdlib>
#include "snaps.h"
#include "mkisosu.h"
#include "mfile_open.h"
#include "mcntl.h"
#include "option.h"

int encho_year( int a );

void waku()
{
	int nendo;
	int sotai_nendo;
	int nenrei;
	int seibetu;
	int seido;
	int goubetu;
	int counter;
	int counter2;
	int waku_seido;
	int waku_seido_p;

	double Santei_Part[6][4][3][2];
	double buffer[BUFFER_MAX];
	int data_number;
	FILE *fp_sotowaku_part;
	
	using namespace std;

	for( seido = SUM ; seido <= SHIGAKU ; seido++ )
	{
		for( goubetu = SUM ; goubetu <= 3 ; goubetu++ )
		{
			for( counter = 0 ; counter <= 2 ; counter++ )
			{
				for( counter2 = 0 ; counter2 <= 1 ; counter2++ )
				{
					Santei_Part[seido][goubetu][counter][counter2] = 0.;
				}
			}
		}
	}
	
	for( waku_seido = SOTOWAKU_START ; waku_seido <= NOURIN_3GOU ; waku_seido++ )
	{
		for( counter = 1 ; counter <= 2 ; counter++ )
		{
			read_data( buffer , fp_in[waku_seido] , &data_number );
		}
		for( seibetu = SUM ; seibetu <= ONNA ; seibetu++ )
		{
			for( nendo = SOTOWAKU_SHONENDO ; nendo <= SOTOWAKU_SAISHUNENDO ; nendo++ )
			{
				if( read_data( buffer , fp_in[waku_seido] , &data_number ) != EOF && buffer[1] == seibetu && buffer[2] == nendo )
				{
					if( seibetu >= OTOKO && nendo >= SHONENDO )
					{
						if( Option == 0 )
						{
							if( waku_seido == KOKUNEN_1GOU )
							{
								Hiho_Kokunen[nendo - SHONENDO] += buffer[3];
							}
 							else if( waku_seido == KOUNEN_2GOU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 ; nenrei++ )
								{
									SanteiTaishou[KOUNEN][nendo - SHONENDO][2] += buffer[nenrei];
								}
							}
 							else if( waku_seido <= SIGAKU_2GOU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_START + 1][nendo - SHONENDO][2] += buffer[nenrei];
								}
							}
 							else if( waku_seido == KOUNEN_3GOU_12SYU || waku_seido == KOUNEN_3GOU_3SYU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 ; nenrei++ )
								{
									SanteiTaishou[KOUNEN][nendo - SHONENDO][3] += buffer[nenrei];
								}
							}
	 						else if( waku_seido <= SIGAKU_3GOU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_START - 4][nendo - SHONENDO][3] += buffer[nenrei];
								}
							}
 							else if( waku_seido <= NOURIN_2GOU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_START - 4][nendo - SHONENDO][2] += buffer[nenrei];
								}
							}
 							else
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_START - 7][nendo - SHONENDO][3] += buffer[nenrei];
								}
							}
						}

						if( Option == 1 )
						{

							if( waku_seido == KOKUNEN_1GOU )
							{
								Hiho_Kokunen[nendo - SHONENDO] += buffer[3];
							}
 							else if( waku_seido == KOUNEN_2GOU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									SanteiTaishou[KOUNEN][nendo - SHONENDO][2] += buffer[nenrei];
								}


							}
 							else if( waku_seido <= SIGAKU_2GOU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_START + 1][nendo - SHONENDO][2] += buffer[nenrei];
								}
							}
 							else if( waku_seido == KOUNEN_3GOU_12SYU || waku_seido == KOUNEN_3GOU_3SYU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									SanteiTaishou[KOUNEN][nendo - SHONENDO][3] += buffer[nenrei];
								}
							}
	 						else if( waku_seido <= SIGAKU_3GOU )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_START - 4][nendo - SHONENDO][3] += buffer[nenrei];
								}
							}
 							else if( waku_seido <= NOURIN_2GOU	 )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_SHONENDO - 4][nendo - SHONENDO][2] += buffer[nenrei];
								}
							}
 							else
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									SanteiTaishou[waku_seido - SOTOWAKU_SHONENDO - 7][nendo - SHONENDO][3] += buffer[nenrei];
								}
							}


						}

					}
				}
				else
				{
					printf( "外枠ファイル読込中にＥＯＦを検出しました。枠制度番号は %d\n" , waku_seido );
					exit( 1 );
				}
			}
		}
	}

	if( Part == 1 )
	{
		for( waku_seido_p = 0 ; waku_seido_p <= 5 ; waku_seido_p++ )
		{
		switch(waku_seido_p)
		{
			case 0:
				fp_sotowaku_part = fp_in[WAKU_1GOU_TO_PART];
				break;
			case 1:
				fp_sotowaku_part = fp_in[WAKU_PART_TO_2GOU];
				break;
			case 2:
				fp_sotowaku_part = fp_in[WAKU_KOUNEN_3GOU_TO_PART];
				break;
			case 3:
				fp_sotowaku_part = fp_in[WAKU_KOKKYOU_3GOU_TO_PART];
				break;
			case 4:
				fp_sotowaku_part = fp_in[WAKU_CHIKYOU_3GOU_TO_PART];
				break;
			case 5:
				fp_sotowaku_part = fp_in[WAKU_SIGAKU_3GOU_TO_PART];
				break;
		}

			for( counter = 1 ; counter <= 2 ; counter++ )
			{
				read_data( buffer , fp_sotowaku_part, &data_number );
			}
			for( seibetu = 0 ; seibetu <= 2 ; seibetu++ )
			{
				for( nendo = SOTOWAKU_SHONENDO ; nendo <= SOTOWAKU_SAISHUNENDO ; nendo++ )
				{
					read_data( buffer , fp_sotowaku_part , &data_number );
					if( seibetu >= 1 )
					{
						if( nendo == Part_Year_1 - 1 )
						{
							if( waku_seido_p == 0 )
							{
								Santei_Part[KOKUNEN][1][1][0] += buffer[3];
							}
							else if( waku_seido_p == 1 )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									Santei_Part[KOUNEN][2][1][0] += buffer[nenrei];
								}
							}
							else
							{
								Santei_Part[waku_seido_p][3][1][0] += buffer[3];
							}
						}
						if( nendo == Part_Year_1 )
						{
							if( waku_seido_p == 0 )
							{
								Santei_Part[KOKUNEN][1][1][1] += buffer[3];
							}
							else if( waku_seido_p == 1 )
							{
								for( nenrei = MIN_HIHO_NENREI - 11 ; nenrei <= 59 - 11 + encho_year( nendo ) ; nenrei++ )
								{
									Santei_Part[KOUNEN][2][1][1] += buffer[nenrei];
								}
							}
							else
							{
								Santei_Part[waku_seido_p][3][1][1] += buffer[3];
							}
						}

					}
				}
			}
		}
	}	
	
	for( nendo = SAISHUNENDO ; nendo >= SHONENDO + 1 ; nendo-- )
	{
		sotai_nendo = nendo - SHONENDO;
		
		if( ( Part == 1 ) && nendo == Part_Year_1 )
		{
			Hiho_Kokunen[sotai_nendo] = ( Hiho_Kokunen[sotai_nendo - 1] + Hiho_Kokunen[sotai_nendo] + Santei_Part[KOKUNEN][1][1][1] ) / 2.
		                                - ( Santei_Part[KOKUNEN][1][1][0] + Santei_Part[KOKUNEN][1][1][1] ) / 2.;
		}
		else
		{
			Hiho_Kokunen[sotai_nendo] = ( Hiho_Kokunen[sotai_nendo - 1] + Hiho_Kokunen[sotai_nendo] ) / 2.;
		}
		
		for( seido = KOUNEN ; seido <= SHIGAKU ; seido++ )
		{
			for( goubetu = 1 ; goubetu <= 3 ; goubetu++ )
			{
				if( ( Part == 1 ) && nendo == Part_Year_1 )
				{
					if( seido == KOUNEN && goubetu == 2 )
					{
						SanteiTaishou[seido][sotai_nendo][goubetu]
						 = ( SanteiTaishou[seido][sotai_nendo - 1][goubetu] + SanteiTaishou[seido][sotai_nendo][goubetu] - Santei_Part[seido][goubetu][1][1] ) / 2.
						     + ( Santei_Part[seido][goubetu][1][0] + Santei_Part[seido][goubetu][1][1] ) / 2.;
					}
					else if( goubetu == 3 )
					{
						SanteiTaishou[seido][sotai_nendo][goubetu]
						 = ( SanteiTaishou[seido][sotai_nendo - 1][goubetu] + SanteiTaishou[seido][sotai_nendo][goubetu] + Santei_Part[seido][goubetu][1][1] ) / 2.
						     - ( Santei_Part[seido][goubetu][1][0] + Santei_Part[seido][goubetu][1][1] ) / 2.;
					}
					else
					{
						SanteiTaishou[seido][sotai_nendo][goubetu]
						 = ( SanteiTaishou[seido][sotai_nendo - 1][goubetu] + SanteiTaishou[seido][sotai_nendo][goubetu] ) / 2.;
					}
				}
				else
				{
						SanteiTaishou[seido][sotai_nendo][goubetu]
					 	= ( SanteiTaishou[seido][sotai_nendo - 1][goubetu] + SanteiTaishou[seido][sotai_nendo][goubetu] ) / 2.;

				}
			}
		}
		for( seido = JR ; seido <= NORIN ; seido++ )
		{
			for( goubetu = 1 ; goubetu <= 3 ; goubetu++ )
			{
				SanteiTaishou[seido][sotai_nendo][goubetu]
				 = ( SanteiTaishou[seido][sotai_nendo - 1][goubetu] + SanteiTaishou[seido][sotai_nendo][goubetu] ) / 2.;
			}
			SanteiTaishou[seido][sotai_nendo][3] = SanteiTaishou[KOUNEN][sotai_nendo][3] * K_Shien[seido - JR];
		}
	}
	
	for( seido = KOKUNEN ; seido <= NORIN ; seido++ )
	{
		for( goubetu = 2 ; goubetu <= 3 ; goubetu++ )
		{
			SanteiTaishou[seido][SHONENDO - SHONENDO][goubetu] = 0.;
		}
	}
	Hiho_Kokunen[SHONENDO - SHONENDO] = 0.;
	
	for( nendo = SHONENDO ; nendo <= SAISHUNENDO ; nendo++ )
	{
		sotai_nendo = nendo - SHONENDO;
		for( seido = KOKUNEN ; seido <= NORIN ; seido++ )
		{
			for( goubetu = 1 ; goubetu <= 3 ; goubetu++ )
			{
				SanteiTaishou[seido][sotai_nendo][SUM] += SanteiTaishou[seido][sotai_nendo][goubetu];
			}
		}
		for( seido = KOKUNEN ; seido <= SHIGAKU ; seido++ )
		{
			for( goubetu = SUM ; goubetu <= 3 ; goubetu++ )
			{
				SanteiTaishou[SUM][sotai_nendo][goubetu] += SanteiTaishou[seido][sotai_nendo][goubetu];
			}
		}
	}
}

int encho_year( int nendo )
{
	int r;
	int max_hikiage_nenrei = OP_MAX_KYOSHUTU_NENREI - MAX_KYOSHUTU_NENREI;

	r = 0;


	if( Option == 1 )
	{
		while( nendo >= OPTION_START +  r * OP_HIKIAGE_KANKAKU)
		{
			r++;

			if(r >= max_hikiage_nenrei)
			{
				break;
			}
		}
	
	}

	return r;

}


