#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <Windows.h>

HANDLE hConsole,hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
const char * FILEName="krainu.txt";

struct country
{
	char kraina[15];
	char stolutsa[20];
	char ch_svity[25];
	float naselenna;
	int area;
} *countries;

int menu();

void console();
void countries_vvedenna();
void countries_load();
void countries_vuvedenna();
void countries_sort_area();
void countries_vudalenna();
void sort_alf();
void GotoXY(int X,int Y){ COORD coord={X,Y};SetConsoleCursorPosition(hStdOut,coord);}
/////////////////////////////
bool check(char c[])
{ bool ch=true;
  int j;   
     for(j=0;c[j]!=0;j++)
       if((IsCharAlpha(c[j])==0)||(isalpha(c[j])!=0)){ch=false;break;}
  return ch;
}
///////////////////////
void main()
{
	countries_load();
	console();

	bool play = true;

	while(play)
	{
		switch (menu())
		{
		case 1: countries_vuvedenna();
			break;
		case 2: countries_vvedenna();
			break;
		case 3: countries_sort_area();
			break;	
		case 4: countries_vudalenna();
			break;
		case 5: sort_alf();
			break;
		case 8: play=false;
		}
		system("pause");
		system("CLS");
	}

	delete [] countries;
}

int menu()
{
	char s[10]; int n;
	do {
		printf("\tГоловне меню:\n");
		printf("+----------------------------------------------------------+\n"
		"|  1: Вивести дані про країни                              |\n"
		"|  2: Ввести дані про країни				   |\n"
		"|  3: Список країн, площа яких більша ніж 500 000 кв. км   |\n"
		"|  4: Видалення країни 					   |\n"
		"|  5: Сортування столиць за алфавітом 		           |\n"
		"|  8: Вихід						   |\n"                                                    
		"+----------------------------------------------------------+\n");
		printf("Введіть номер потрібного пункту: "); gets(s);
		n = atoi(s);
		system("CLS");
	} while(n<1 || n>8);
	return n;
}

void console()
{
	SetConsoleCP(1251);         
	SetConsoleOutputCP(1251); 
} 

long file_element()
{
	FILE  *fp; 
	if((fp=fopen(FILEName, "ab"))==NULL) printf("Помилка при відкритті файлу.\n");

	fseek(fp, 0, SEEK_END);  
	long element = ftell(fp)/sizeof(struct country);
	fclose(fp);
	return element;
}

void countries_load()
{
	delete [] countries;  
	FILE  *fp;
	if((fp=fopen(FILEName, "rb"))==NULL)  printf("Помилка при відкритті файлу.\n"); 

	countries = new country[file_element()];
	for(int i = 0; i<file_element(); i++)
		if(fread(&countries[i],sizeof(struct country), 1, fp)!=1) {
			if(feof(fp)) break;
			printf("Помилка зчитування файлу.\n");
		}
		fclose(fp);
}

void countries_vuvedenna()
{
	int count = file_element();
	if(count != 0)
	{
		printf(" \nСписок країн світу;\n");
		printf("+--------------+----------------+----------------+-------------+------------+\n"
			"| Назва країни |  Назва столиці |   Континент    |   Населення |    Площа   |\n"
			"+--------------+----------------+----------------+-------------+------------+\n");
		for(int i = 0; i<count; i++)
		{
			printf("| %-12s",countries[i].kraina);
			printf(" | %-14s",countries[i].stolutsa);
			printf(" | %-14s",countries[i].ch_svity);
			printf(" | %-11.0f",countries[i].naselenna);
			printf(" | %-10d |\n",countries[i].area);
		}
		printf("+--------------+----------------+----------------+-------------+------------+\n");
	}
	else printf("Файл порожній!!!\n");
}

void countries_vvedenna()
{
	int n=1, read = 0;
	
	FILE *fp;
	if((fp=fopen(FILEName,"ab"))==NULL)
	printf("При відкритті файлу сталася помилка.\n");
	
	while(n!=0)
	{
		country coun;
		
		printf("Введіть назву країни:");
		while(1){
		scanf("%9s",&coun.kraina);
		if(check(coun.kraina)==false){Beep(500,200);Beep(500,200);printf("Ви ввели невiрну назву країни...Повторiть ввiд: \n");}
		else break;
		fflush(stdin);
        }	
		
		printf("Введіть назву столиці:");
		while(1){
		scanf("%9s",&coun.stolutsa);
		if(check(coun.stolutsa)==false){Beep(500,200);Beep(500,200);printf("Ви ввели невiрну назву столиці...Повторiть ввiд: \n");}
		else break;
		fflush(stdin);
		}

		printf("Введіть континент, на якому знаходиться країна:");
		while(1){
		scanf("%9s",&coun.ch_svity);
		if(check(coun.stolutsa)==false){Beep(500,200);Beep(500,200);printf("Ви ввели невiрний континент...Повторiть ввiд: \n");}
		else break;
		fflush(stdin);
		}

		printf("Введіть населення країни:");
		scanf("%f",&coun.naselenna);
		
		printf("Введіть площу країни:");
		scanf("%d",&coun.area);
		
		if(fwrite(&coun,sizeof(struct country),1, fp)!=1)
		printf("Виникла помилка при записі у файл.\n");
		
		do{printf("Введіть 0 щоб зупинити ввід або 1 для продовження вводу:"); scanf("%d",&n);} while(!(n==0 || n==1));
	}
	fclose(fp);
	countries_load();
	delete [] countries;
}
		
void countries_sort_area()
{
	int count = file_element(), exist =0;
	if(count == 0) { printf("Файл порожній!!!\n"); return; }

	for(int i = 0; i < count; i++) 
		if(countries[i].area > 500000)  exist++;
		if( exist == 0 ) { printf("Не знайдено жодної інформації!\n"); return; }
		printf(" \tСписок країн, площа яких перевищує 500 000 кв. км;\n");
		printf("\n");
		printf(" +-------------------+-----------------+\n"
			" |     Назва країни     |     Площа    |\n"
			" +----------------------+--------------+\n");

		for(int i = 0; i < count; i++)
			if(countries[i].area > 500000) 
			{
			printf(" |%-12s          |",countries[i].kraina);
			printf(" %-12d |\n", countries[i].area);
			}
	printf(" +-------------------------------------+\n\n");
}


void sort_alf()
{
country stolutsa;
int n = file_element();
if(n == 0) { printf("Файл порожній!!!\n"); return;}
for (int i = n - 1; i >= 0; i--)
for (int j = 0; j < i; j++)
if (countries[j].stolutsa[0] > countries[j+1].stolutsa[0])
{
	stolutsa = countries[j];
	countries[j] = countries[j+1];
	countries[j+1]=stolutsa;
}
printf(" \n--Посортувати по алфавіту столиці:\n");
countries_vuvedenna();
}

