//
//
//		data.cpp
//
//

// インクルードファイル
#include <stdio.h>
#include <stdlib.h>
#include "data.h"
#include "player.h"

// 定数定義
#define FILE_NAME ("data.bin")
#define MAX_PLAYER (3)

// コンストラクタ
CData::CData()
{

	m_pPlayer = nullptr;
	m_nPlayerCount = 0;

}
// デストラクタ
CData::~CData()
{
	m_pPlayer = nullptr;

}
// 初期化処理
void CData::Init()
{
	if( m_pPlayer != NULL ){
	
		delete[] m_pPlayer;
		m_pPlayer = nullptr;
	
	}

}
// 終了処理
void CData::Uninit()
{
	if( m_pPlayer != NULL ){

		for(int inc=0;inc < MAX_PLAYER;inc++){
			m_pPlayer[inc].Uninit();
		}
		delete[] m_pPlayer;
		m_pPlayer = nullptr;

	}
}
// モード選択
void CData::SelectMode( )
{

	MODE mode;							//モード

	int select;							//モードの選択
	bool modeInput=false;				//モードの選択が正しいか判定
	bool saveClear=false;				//セーブフラグ
	bool loadClear=false;				//ロードフラグ
	bool clearInput=false;				//

	//モード選択
	do{
	
		while(!modeInput){

			system("cls");												//画面初期化
			
			printf("使用したいモードを選択してください\n");
			printf("1 : Input\n");
			printf("2 : Output\n");
			printf("3 : Save\n");
			printf("4 : Load\n");
			printf("0 : exit\n");

			printf("> :");
			rewind(stdin);
			scanf("%d",&select);

			if(select < MODE_MAX){
				modeInput=true;
			}
		}
		

		switch(select)
		{

			case MODE_FINISH:

					printf("終了します!");
					rewind(stdin);
					getchar();
					system("cls");
				
				break;


			case MODE_INPUT:

					CData::Input( );
					saveClear=true;
					clearInput=true;

				break;

			case MODE_OUTPUT:

					if(loadClear==true || clearInput==true){
						CData::Output( );
					}
					else
					{
						printf("出力出来ませんロードしてください\n");
						rewind(stdin);
						getchar();
						system("cls");

					}


				break;

			case MODE_SAVE:

					if(saveClear==true){
						CData::saveData( );
					}
					else
					{
						printf("セーブ出来ません\n");
						rewind(stdin);
						getchar();
						system("cls");
					}

				break;

			case MODE_LOAD:

					loadClear=CData::loadData( );
					

				break;

			default:

				break;
		
		}
		modeInput=false;
	
	}while( select!=MODE_FINISH );


}
// 入力処理
void CData::Input()
{
	
	do{
		//人数の入力
		printf("何人分入力しますか? > ");
		scanf("%d",&m_nPlayerCount);
		rewind(stdin);

		if( (m_nPlayerCount) > MAX_PLAYER){
		
			printf("入力内容が間違っています\n");
		}

	}while( m_nPlayerCount > MAX_PLAYER || m_nPlayerCount <= 0);

	if( m_pPlayer != NULL ){

		for(int inc=0;inc < MAX_PLAYER;inc++){
			m_pPlayer[inc].Uninit();
		}
		delete[] m_pPlayer;
		m_pPlayer = nullptr;

	}

	m_pPlayer = new CPlayer[ m_nPlayerCount ];


	// 人数分初期化処理
	for(int inc=0; inc < m_nPlayerCount ; inc++ ){
		m_pPlayer[inc].Init();
	}


	//入力処理
	for(int inc=0 ;inc < m_nPlayerCount ; inc++)
	{
		m_pPlayer[inc].Input();
	}

}
// 出力処理
void CData::Output( )
{

	//出力処理
	for(int inc=0;inc < m_nPlayerCount; inc++){

		printf("%d回目\n",( inc+1 ));

		//プレイヤーデータの出力
		m_pPlayer[inc].Output();
	}
	rewind(stdin);
	getchar();

}
// データをセーブする
void CData::saveData( )
{

	FILE *pFile;
	int nLife;
	int nAttack;
	int nSpeed;

	
	//エラー処理
	if( m_nPlayerCount==0 || m_nPlayerCount>MAX_PLAYER)
	{
		printf("プレイヤーの数が正常ではありません!!");
	}
	else{

		if(m_pPlayer!=NULL){

			pFile = fopen(FILE_NAME,"wb");
			
			if(pFile!=NULL){

				fwrite(&m_nPlayerCount,sizeof(int),1,pFile);

				for(int nCount=0;nCount < m_nPlayerCount;nCount++){

					nLife = m_pPlayer[nCount].GetLife();
					nAttack = m_pPlayer[nCount].GetAttack();
					nSpeed = m_pPlayer[nCount].GetSpeed();

					fwrite(&nLife,sizeof(int),1,pFile);
					fwrite(&nAttack,sizeof(int),1,pFile);
					fwrite(&nSpeed,sizeof(int),1,pFile);
				}

				printf("セーブが完了しました!!\n");

				fclose(pFile);

			}
			else{
				printf("ファイルが開けませんでした!\n");
			}

		}
		else
		{
			printf("データの値が不正です\n");
		}
	}

	rewind(stdin);
	getchar();
	system("cls");

}
// データをロードする
bool CData::loadData( )
{

	FILE *pFile;
	int nLife;
	int nAttack;
	int nSpeed;

	
	pFile = fopen(FILE_NAME,"rb");

	if(pFile!=NULL){

		fread(&m_nPlayerCount,sizeof(int),1,pFile);

		if( m_pPlayer != NULL ){

			for(int inc=0;inc < MAX_PLAYER;inc++){
				m_pPlayer[inc].Uninit();
			}
			delete[] m_pPlayer;
			m_pPlayer = nullptr;

		}

		m_pPlayer = new CPlayer[ m_nPlayerCount ];

		// 人数分初期化処理
		for(int inc=0; inc < m_nPlayerCount ; inc++ ){
			m_pPlayer[inc].Init();
		}

		for(int nCount=0;nCount < m_nPlayerCount;nCount++){

			fread(&nLife,sizeof(int),1,pFile);
			fread(&nAttack,sizeof(int),1,pFile);
			fread(&nSpeed,sizeof(int),1,pFile);

			m_pPlayer[nCount].SetLife( nLife );
			m_pPlayer[nCount].SetAttack( nAttack );
			m_pPlayer[nCount].SetSpeed( nSpeed );

		}

		fclose(pFile);

		printf("ロードが完了しました!!\n");
		rewind(stdin);
		getchar();
		system("cls");

		return true;

	}
	else{
			
		printf("ロードに失敗しました!!");

	}
	

	rewind(stdin);
	getchar();
	system("cls");
	
	return false;

}
