#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <time.h>

#include "libmine.h"

static void mine_stat( int* map, int* show, int option );

int main( int argc, char** argv ){

	int map[WIDTH*HEIGHT];
	int show[WIDTH*HEIGHT];

	int status;
	int x, y, mine;

	char yn;

	do {

		status = GAME_START;
		do {

			if( status == GAME_START )
				printf( "Starting New Game \n\n" );

			do {
				printf( "Input: x y mine(0/1):" );
				scanf( " %d %d %d", &x, &y, &mine );

				if( status == GAME_START && mine != 0 )
					printf( "You must not select mine at first time\n" );

				else if( mine == 2 )
					mine_stat( map, show, GAME_FULL_STAT );

				else if( x < 0 || x >= WIDTH )
					printf( "Wrong range x: %d\n", x );

				else if( y < 0 || y >= HEIGHT )
					printf( "Wrong range y: %d\n", y );

				else if( mine != 0 && mine != 1 )
					printf( "Wrong mine: %d\n", mine );

				else
					break;

			} while( 1 );

			if( status == GAME_START ){
				memset( show, UNCHECKED, sizeof(int)*WIDTH*HEIGHT );
				mine_start( map, MAXMINE, 0, 0 );

				status = GAME_CONT;
			} 

			status = mine_tick( map, show, x, y, mine );
			if( status == GAME_END ){
				printf( "Game End: It was mine!\n" );

				mine_stat( map, show, GAME_END );
				break;
			}
			else if( status == GAME_END ){
				printf( "You already checked there.\n" );
			}	
			else if( mine_end( map, show ) == GAME_END ){
				mine_stat( map, show, GAME_END );

				printf( "Congraturation!!!\n\n\n" );
				break;
			}
			mine_stat( map, show, GAME_CONT );

		} while( 1 );

		printf( "\n\nStarting New Game? (Y/N): " );
		scanf( " %c", &yn );

	} while ( yn == 'y' || yn == 'Y' );

	return 0;

}

static void mine_stat( int* map, int* show, int option ){

	int i, j;

	// Draw Horizontal Index Line
	for( i = 0 ; i <= WIDTH ; i++ )
		printf( "----" );

	printf( "\n    " );

	for( i = 0 ; i < WIDTH ; i++ )
		printf( "%3d ", i );

	printf( "\n" );

	for( i = 0 ; i <= WIDTH ; i++ )
		printf( "----" );

	printf( "\n" );

	for(j = 0 ; j < HEIGHT ; j++ ){

		// Draw Vertical Index
		printf( "%3d:", j );

		// Show status
		for( i = 0 ; i < WIDTH ; i++ ){
			if( option == GAME_END ){

				if( show[j*WIDTH+i] == MINE ){
					if( map[j*WIDTH+i] == -1 )
						printf( "  # " );
					else
						printf( "  X " );
				}
				else{
					if( map[j*WIDTH+i] == MINE )
						printf( "  # " );
					else
						printf( "%3d ", map[j*WIDTH+i] );
				}

			}
			else if( option == GAME_FULL_STAT ){

				if( map[j*WIDTH+i] == MINE )
					printf( "  # " );
				else
					printf( "%3d ", map[j*WIDTH+i] );

			}
			else {

				if( show[j*WIDTH+i] == MINE )
					printf( "  # " );
				else if( show[j*WIDTH+i] == NUM )
					printf( "%3d ", map[j*WIDTH+i] );
				else 
					printf( "    " );

			}

		}
		printf( "\n" );
	}

	// Draw Horizontal Line
	for( i = 0 ; i <= WIDTH ; i++ )
		printf( "----" );

	printf( "\n" );
}
