#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "set.h"
#include "glva.h"

void shus_init(void);    /* 収支計算初期化 */
void init_premium(void); /* 保険料率のセット */
void shus_premium(void); /* 保険料の計算 */
void shus_fukkjn(void);  /* 基準年度の積立金、及び、その他の収支セット */


/** shus_out.c **/
void shus_econ_out(void); /* 経済前提等出力 */
void shus_nin_out(void);  /* 被保険者数、受給者数等を出力 */
void shus_shushiout(int); /* 収支の出力 */
void shus_cutout(void);   /* カット率ファイルの出力 */

void shus_summary(void);  /* 収支サマリファイルの出力 */

/** shus_fullout.c **/
void shus_fullout(int);  /* 詳細収支の出力 */

/** shus_calc.c **/
void shus_calc0(void);	/* 調整前収支の作成 */
int  shus_calc8(void);	/* 国年先決め有限均衡 */
void shus_calc9(void);	/* カット率指定の収支計算等 */

void shus_smodel(void);

void shus(void){
	/*** 初期化 ***/
	shus_init();
	init_premium();
	shus_smodel();
	
	/*** 保険料収入の設定（・パート報酬の足しこみ） ***/
	shus_premium();
	
	/*** その他収支の設定 ***/
	shus_fukkjn();
	
	/*** 経済前提、受給者数等の出力 ***/
	shus_econ_out();
	shus_nin_out();
	
	/*** スライド調整前給付費等の作成（Cc初期化） ***/
	shus_calc0();
	shus_shushiout(0);
	shus_fullout(0);
	
	/* 国年先決め１００年均衡 */
	if(Fpset==8) shus_calc8();
	
	/* カット率指定 */
	if(Fpset==9) shus_calc9();
	
	shus_shushiout(1);
	shus_fullout(1);
	
	/* カット率ファイルの出力 */
	if(Fpset!=9) shus_cutout();
	
	/* サマリファイルの出力 */
	shus_summary();
}



void shus_init(void){
	int jj, k, x, dx;
	int ii, usd;
	
	
	for(ii=1; ii<=4; ii++){
		usd=ii2usd(ii);
		
		for(k=Ks; k<=Ke; k++){
			for(x=XA-1; x<=XB; x++){
				if(x<67){ dx = 66; } else { dx = x; }
				
				E3dxb[ii][0][k-STTY][dx] += D3bxtp[ii][0][0][1][k-STTY][x];
				E3dxb[ii][1][k-STTY][dx] +=( D3bxtp[ii][0][0][3][k-STTY][x] + D3bxtp[ii][0][0][4][k-STTY][x]
				                            +D3bxtp[ii][0][0][6][k-STTY][x] + D3bxtp[ii][0][0][7][k-STTY][x]);
				E3dxb[ii][2][k-STTY][dx] += D3bxtp[ii][0][0][5][k-STTY][x];
				E3dxb[ii][3][k-STTY][dx] += Kfpbxtp[ii][0][0][1][k-STTY][x];
				E3dxb[ii][4][k-STTY][dx] += Kfpbxtp[ii][0][0][2][k-STTY][x];
				E3dxb[ii][5][k-STTY][dx] += Kfpbxtp[ii][0][0][7][k-STTY][x];
				
				E3dxb[ii][6][k-STTY][dx] += Kyosdx[0][usd][0][k-STTY][x];
				E3dxb[ii][7][k-STTY][dx] += Kfkyosdx[0][usd][0][k-STTY][x];
				E3dxb[ii][8][k-STTY][dx] += Kyosdx[1][usd][0][k-STTY][x];
				E3dxb[ii][9][k-STTY][dx] += Kfkyosdx[1][usd][0][k-STTY][x];
				E3dxb[ii][10][k-STTY][dx]+= Kyosdx[0][usd][1][k-STTY][x];
				E3dxb[ii][11][k-STTY][dx]+= Kfkyosdx[0][usd][1][k-STTY][x];
				E3dxb[ii][12][k-STTY][dx]+= Kyosdx[1][usd][1][k-STTY][x];
				E3dxb[ii][13][k-STTY][dx]+= Kfkyosdx[1][usd][1][k-STTY][x];
			}
		}
	}
	
	for(ii=1; ii<=4; ii++){
		for(jj=0; jj<=13; jj++){
			for(k=Ks; k<=Ke; k++){
				for(x=66; x<=XB; x++){
					E3dxb[0][jj][k-STTY][x] += E3dxb[ii][jj][k-STTY][x];
				}
			}
		}
	}
}


void init_premium(void){
	/* 保険料率の設定 */
	/* Premx[制度][年度] 制度：1現厚年,2国共,3地共,4私学,5厚年3種 */
	int ii, k;
	double dtemp1, dtemp2;
	
	if(Ks<10 || Ks<STTY){
		printf("【警告】保険料率が正しくセットできていません\n");
	}
	
	/* 現厚年の設定 */
	dtemp1 = 0.1358;
	dtemp2 = 0.1496;
	for(k=4; k<=ENDY; k++){
	    dtemp1 += 0.00354;
	    dtemp2 += 0.00248;
		if(k>=STTY){
			Prema[1][k-STTY] = MIN(0.183, dtemp1);
			Prema[5][k-STTY] = MIN(0.183, dtemp2);
		}
	}
	dtemp1 = 0.15154;
	dtemp2 = 0.1223;
	for(k=10; k<=ENDY; k++){
		dtemp1 += 0.00354;
		dtemp2 += 0.00354;
		if(k>=STTY){
			Prema[2][k-STTY] = Prema[3][k-STTY] = MIN(0.183, dtemp1);
			Prema[4][k-STTY] = MIN(0.183, dtemp2);
		}
	}
	
	/** 保険料率の年度平均を求める **/
	for(ii=1; ii<=5; ii++){
		if(ii==1 || ii==5 ){
			dtemp1=6.0;
			dtemp2=6.0;
		} else if(ii==2 || ii==3){
			dtemp1=5.0;
			dtemp2=7.0;
		} else if(ii==4){
			dtemp1= 1.0;
			dtemp2=11.0;
		}
		for(k=Ks+1; k<=ENDY; k++){
			Premb[ii][k-STTY] = (dtemp1 * Prema[ii][k-1-STTY] + dtemp2 * Prema[ii][k-STTY] ) / 12.;
		}
	}
}


void shus_premium(void){	/* 保険料の計算 */
	int k, s;
	int ii, se;
	double prem[3];	/* 保険料収入:prem[j] */
	/* j:0計、１本体、2上乗せ */
	double dtemp;
	
	
	if(Flg_Houjou>0){
		for(ii=1; ii<=4; ii++){
			if(ii==1) se=3;
			else      se=2;
			for(s=0; s<=se; s++){
				for(k=Ks; k<=Ke; k++){
					if(k==Houjou_Yr){
						An[ii][s][k-STTY]    *= 1.0 + (Houjou_R - 1.0) / 2.0;
						Aniku[ii][s][k-STTY] *= 1.0 + (Houjou_R - 1.0) / 2.0;
						A[ii][s][k-STTY]     *= 1.0 + (Houjou_R - 1.0) / 2.0;
						Aiku[ii][s][k-STTY]  *= 1.0 + (Houjou_R - 1.0) / 2.0;
						if(Flg_Part>0 && (k==Part_Yr1 || k==Part_Yr2)){
							Anpart[s][k-STTY]    *= 1.0 + (Houjou_R - 1.0) / 2.0;
							Anikupart[s][k-STTY] *= 1.0 + (Houjou_R - 1.0) / 2.0;
							Apart[s][k-STTY]     *= 1.0 + (Houjou_R - 1.0) / 2.0;
							Aikupart[s][k-STTY]  *= 1.0 + (Houjou_R - 1.0) / 2.0;
						}
					}else if(k>Houjou_Yr){
						An[ii][s][k-STTY]    *= Houjou_R;
						Aniku[ii][s][k-STTY] *= Houjou_R;
						A[ii][s][k-STTY]     *= Houjou_R;
						Aiku[ii][s][k-STTY]  *= Houjou_R;
						if(Flg_Part>0 && (k==Part_Yr1 || k==Part_Yr2)){
							Anpart[s][k-STTY]    *= Houjou_R;
							Anikupart[s][k-STTY] *= Houjou_R;
							Apart[s][k-STTY]     *= Houjou_R;
							Aikupart[s][k-STTY]  *= Houjou_R;
						}
					}
				}
			}
		}
	}
	
	
	/*****************************************************************
	             保険料収入計算
	 *****************************************************************/
	for(ii=1; ii<=4; ii++){
		for(k=Ks+1; k<=Ke; k++){
			if(ii==1){
				/* 本体保険料の計算 */
				prem[1]  = An[ii][0][k-STTY] * Premb[1][k-STTY];
				/* 上乗せ保険料の計算:3種のみ */
				prem[2]  = An[ii][3][k-STTY] * (Premb[5][k-STTY]-Premb[1][k-STTY]);
				
				Cc[ii][1][k-STTY] = prem[1] + prem[2];
				Cc[ii][2][k-STTY] = prem[2];
				
				/* パート適用分保険料 */
				if(Flg_Part>0 && (k==Part_Yr1 || k==Part_Yr2)){
					if(k==Part_Yr1) dtemp=Cbm_Pt1;
					else            dtemp=Cbm_Pt2;
					if(dtemp<=6.0){
						dtemp=Prema[1][k-STTY];
					}else{
						dtemp=((dtemp-6.0)*Prema[1][k-1-STTY]+6.0*Prema[1][k-STTY])/dtemp;
					}
					Cc[ii][22][k-STTY] = Anpart[0][k-STTY] * dtemp;
					Cc[ii][1][k-STTY] += Cc[ii][22][k-STTY];
					for(s=0; s<=3; s++){
						A[ii][s][k-STTY]    += Apart[s][k-STTY];
						Aiku[ii][s][k-STTY] += Aikupart[s][k-STTY];
						A60[ii][s][k-STTY]  += A60part[s][k-STTY];
						A65[ii][s][k-STTY]  += A65part[s][k-STTY];
						A70[ii][s][k-STTY]  += A70part[s][k-STTY];
						
						An[ii][s][k-STTY]    += Anpart[s][k-STTY];
						Aniku[ii][s][k-STTY] += Anikupart[s][k-STTY];
					}
				}
			} else {  /* 現厚年以外の時(一元化年度は後で修正) */
				Cc[ii][1][k-STTY] = An[ii][0][k-STTY] * Premb[ii2psd(ii)][k-STTY];
			}
			
			/* 総報酬額等 */
			Cc[ii][23][k-STTY] = A[ii][0][k-STTY] + Aiku[ii][0][k-STTY];
			Cc[ii][24][k-STTY] = An[ii][0][k-STTY]   ;
			Cc[ii][25][k-STTY] = Aniku[ii][0][k-STTY];
		}
	}
	
	/***  一元化時の全厚年作成等 ***/
	for(ii=1; ii<=4; ii++){
		Dc[ii][1]  = An[ii][0][Kyoskijun-STTY]  / 2. * Prema[ii][Kyoskijun-STTY];
		Dc[ii][23] = Cc[ii][23][Kyoskijun-STTY] / 2.;
		Dc[ii][24] = Cc[ii][24][Kyoskijun-STTY] / 2.;
		Dc[ii][25] = Cc[ii][25][Kyoskijun-STTY] / 2.;
		
		for(k=Ks+1; k<=Ke; k++){
			if(k>Kyoskijun || ii==1){
				Cc[0][1][k-STTY] += Cc[ii][1][k-STTY];
				if(ii==1) Cc[0][2][k-STTY] += Cc[ii][2][k-STTY];
				if(Flg_Part>0 && (k==Part_Yr1 || k==Part_Yr2) && ii==1)
				  Cc[0][22][k-STTY] += Cc[ii][22][k-STTY];
				Cc[0][23][k-STTY] += Cc[ii][23][k-STTY];
				Cc[0][24][k-STTY] += Cc[ii][24][k-STTY];
				Cc[0][25][k-STTY] += Cc[ii][25][k-STTY];
			} else if(k==Kyoskijun){
				Cc[0][1][k-STTY]  += Dc[ii][1];
				Cc[0][23][k-STTY] += Dc[ii][23];
				Cc[0][24][k-STTY] += Dc[ii][24];
				Cc[0][25][k-STTY] += Dc[ii][25];
			}
		}
	}
}



void shus_fukkjn(void){
	int k, ii, psd;
	
	for(ii=1; ii<=4; ii++){
		psd=ii2psd(ii);
		/* 積立金のセット */
		if(ii==1) Cc[ii][20][12-STTY] = 1440617.0E+8;
		
		for(k=Ks+1; k<=Ke; k++){
			Cc[ii][ 9][k-STTY] = Sien[0][psd][k-STTY];
			Cc[ii][10][k-STTY] = Nofu[psd][k-STTY];
			
			if(ii==1){
				Cc[ii][17][k-STTY] = 796.31340E+8;  /* H24実績 */
			} else if(ii==2){
				Cc[ii][17][k-STTY] =  16.34296E+8;
			} else if(ii==3){
				Cc[ii][17][k-STTY] =  73.81605E+8;
			} else if(ii==4){
				Cc[ii][17][k-STTY] =  15.51323E+8 * 10./11.;  /* H24実績＊１００／１１０ */
			}
			if(k>=15){
				Cc[ii][17][k-STTY]=Cc[ii][17][14-STTY]/Ap[ii][0][14-STTY]*Ap[ii][0][k-STTY];
			}
			
			Cc[ii][18][k-STTY] = Sien[1][psd][k-STTY];
		}
	}
	
	/*** 一元化時の全厚年計算 ***/
	for(ii=1; ii<=4; ii++){
		if(ii==1) Dc[ii][10] = Cc[ii][10][Kyoskijun-STTY] / 2.;
		Dc[ii][17] = Cc[ii][17][Kyoskijun-STTY] / 2.;
		Dc[ii][30] = Tumazumi[ii][Kyoskijun-STTY];
		
		for(k=Ks+1; k<=Ke; k++){
			if(k>Kyoskijun || ii==1){
				Cc[0][9][k-STTY] +=Cc[ii][9][k-STTY];
				Cc[0][10][k-STTY]+=Cc[ii][10][k-STTY];
				Cc[0][17][k-STTY]+=Cc[ii][17][k-STTY];
				if(ii==1) Cc[0][20][k-STTY] = Cc[ii][20][k-STTY];
				Cc[ii][30][k-STTY] = Tumazumi[ii][k-STTY];
				Cc[0][30][k-STTY] += Tumazumi[ii][k-STTY];
			} else if(k==Kyoskijun){
				Cc[0][17][k-STTY] += Dc[ii][17];
				Cc[ii][30][k-STTY] = Dc[ii][30];
				Cc[0][30][k-STTY] += Dc[ii][30];
			}
		}
	}
}

