/****************************************
*                                       *
*    財政検証標準フォーマット対応関数   *
*                                       *
*                                       *
****************************************/

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include "snaps.h"
#include "file_open.h"
#include "cntl.h"


// double型のデータ読み込み
int read_data( double buffer[] , FILE *fp , int *data_number_ptr )
{
	int c;
	int previous_c;
	int data_number;
	int comma_number;
	char s[BUFFER_MAX];
	char *sptr;
	
	using namespace std;
	
	// 初期化
	data_number = -1;
	comma_number = 0;
	sptr = s;
	
	// fpから１文字cに取得。cがEOFでも改行でもないときに限り処理を継続。
	while( ( ( c = fgetc(fp) ) != EOF) && (c != '\n') )
	{
		// cが区切り文字の場合
		if( c == ',' )
		{
			// エラー処理
			if( ++comma_number > DATA_MAX )
			{
				cout << "エラー(in read_data) １行の中のカンマの数が" << DATA_MAX << "個を超えています" << endl;
				exit( 1 );
			}
			
			if( sptr - s > BUFFER_MAX - 1 )
			{
				cout << "エラー(in read_data) １つのデータの文字数が" << BUFFER_MAX - 1 << "個を超えています" << endl;
				exit( 1 );
			}
			
			*sptr = '\0';
			
			buffer[++data_number] = atof(s);
			
			sptr = s;
		}
		else
		{
			// cを代入してポインタを一つ進める
			*sptr++ = c;
		}
		
		// 直前の取得文字を保管
		previous_c = c;
	}
	
	// 終了処理
	// 直前の取得文字がカンマでない場合について処理
	if( previous_c != ',' )
	{
		
		// エラー処理
		if( ++comma_number > DATA_MAX )
		{
			cout << "エラー(in read_data) １行の中のカンマの数が" << DATA_MAX << "個を超えています" << endl;
			exit( 1 );
		}
			
		if( sptr - s > BUFFER_MAX - 1 )
		{	
			cout << "エラー(in read_data) １つのデータの文字数が" << BUFFER_MAX - 1 << "個を超えています" << endl;
			exit( 1 );
		}
		
		*sptr = '\0';
		
		buffer[++data_number] = atof(s);
		
	}
	
	// データ数-1を返す
	*data_number_ptr = data_number;
	
	// EOFを返す
	if( c == EOF )
	{
		return(EOF);
	}
	else
	{
		return(0);
	}
}


// ヘッダの読み込み処理
void read_headder( FILE *fp )
{
	// 変数宣言
	char char_buffer[257];
	int seido;
	int system;
	int jouhou;
	int Done;
	
	Done = 0;
	
	while( Done == 0 && fgets( char_buffer , 256 , fp ) != NULL )
	{
		if( char_buffer[0] == '#' )
		{
			sscanf( char_buffer , "#%d-%d-%d" , &seido , &system , &jouhou );
			if( seido == 99 )
			{
				Done = 1;
			}
		}
	}
}


void write_BeginData( char Version[] , char ShisanNaiyou[] , FILE *fp )
{
	time_t w_time;
	struct tm *w_tm;
	
	time( &w_time );
	w_tm = localtime( &w_time );
	
	fprintf( fp , "%s\n", asctime( w_tm ) );
	
	// バージョン情報を出力
	fprintf( fp , "%s\n" , Version );
	fprintf( fp , "%s" , ShisanNaiyou );
	
	// データ部識別子を出力
	fprintf( fp , "#99-0000-0000\n" );
}


// バージョン確認
void VersionConfirm()
{
	// 変数宣言
	FILE *fp_version;
	char answer;
	
	using namespace std;
	
	if( ( fp_version = fopen( "Version" , "r" ) ) == NULL )
	{
		cout << "バージョンファイルのオープンに失敗しました" << endl;
		exit( 1 );
	}
	
	fgets( Version , 100 , fp_version );
	fclose( fp_version );
	
	cout << "The version number of this run is " << Version << "." << endl;
	cout << "OK? (press 'y' for yes)" << endl;
	cin >> answer;
	if( answer != 'y' )
	{
		cout << "Version Error. Execution terminated." << endl;
		exit( 1 );
	}
}


// 最大値
double max( double a , double b )
{
	return( ( a > b ) ? a : b );
}


// 最小値
double min( double a , double b )
{
	return( ( a < b ) ? a : b );
}


//年度別保険者延長期間
int encho_year( int a )
{
	int r;
	if( Option3 == 1 )
	{
		if( a <= 2017 )
		{
			r = 0;
		}
		if( a == 2018 || a == 2019 || a == 2020 )
		{
			r = 1;
		}
		if( a == 2021 || a == 2022 || a == 2023 )
		{
			r = 2;
		}
		if( a == 2024 || a == 2025 || a == 2026 )
		{
			r = 3;
		}
		if( a == 2027 || a == 2028 || a == 2029 )
		{
			r = 4;
		}
		if( a >= 2030 )
		{
			r = 5;
		}
	}
	else
	{
		r = 0;
	}
	return r;
}
