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

#define SEIZAMAX 12
//星座データ
struct Star {
	int x, y;	//座標
	int magnitude;	//等級
};
struct Line {
	int startpt, endpt;
};
struct Seiza {
	char* name;		//星座名
	Star* stars;	//星の配列
	int starnum;	//星の数
	Line* lines;	//線の配列
	int linenum;	//線の数
};

Seiza g_seiza[SEIZAMAX];

//関数プロトタイプ宣言
void DrawSeiza(Seiza*);

int main() {
	//ファイル読み込み
	FILE* fp;
	if (fopen_s(&fp, "zodiac.txt", "r") != 0) {
		printf("ファイル読み込みエラー\n");
		return -1;
	}
	char rbuf[256];
	for (int i = 0; i < SEIZAMAX; i++) {
		if (fgets(rbuf, 256, fp) == NULL) break;
		//最初は星座名
		int len = strlen(rbuf);
		g_seiza[i].name = (char*)malloc(sizeof(char) * len);
		strncpy_s(g_seiza[i].name, len, rbuf, len - 1);
		g_seiza[i].name[len - 1] = '\0';
		//星の数
		if (fgets(rbuf, 256, fp) == NULL) break;
		sscanf_s(rbuf, "%d", &g_seiza[i].starnum);
		//メモリ確保
		g_seiza[i].stars =
			(Star*)malloc(sizeof(Star) * g_seiza[i].starnum);
		//星データ読み込み
		for (int j = 0; j < g_seiza[i].starnum; j++) {
			if (fgets(rbuf, 256, fp) == NULL) break;
			int x, y, m;
			sscanf_s(rbuf, "%d, %d, %d", &x, &y, &m);
			g_seiza[i].stars[j].x = x;
			g_seiza[i].stars[j].y = y;
			g_seiza[i].stars[j].magnitude = m;
		}
		//線の数
		if (fgets(rbuf, 256, fp) == NULL) break;
		sscanf_s(rbuf, "%d", &g_seiza[i].linenum);
		//メモリ確保
		g_seiza[i].lines =
			(Line*)malloc(sizeof(Line) * g_seiza[i].linenum);
		//線データ読み込み
		for (int j = 0; j < g_seiza[i].linenum; j++) {
			if (fgets(rbuf, 256, fp) == NULL) break;
			int sp, ep;
			sscanf_s(rbuf, "%d, %d", &sp, &ep);
			g_seiza[i].lines[j].startpt = sp;
			g_seiza[i].lines[j].endpt = ep;
		}
	}
	fclose(fp);

	gcls();
	gfront();

	gimage("C:\\GConsole追加ファイル\\sampleimg\\chap7-1.png", 0, 0);
	DrawSeiza(&g_seiza[0]);

	//メモリ解放
	for (int i = 0; i < SEIZAMAX; i++) {
		free(g_seiza[i].name);
		free(g_seiza[i].stars);
		free(g_seiza[i].lines);
	}
}

//星座の表示
void DrawSeiza(Seiza* sz) {
	//Seiza *sz = &g_seiza[seizaid];
	//星座名の表示
	gcolor(255, 255, 0);	//黄色に設定
	glocate(6, 1);
	gprintf("%s", sz->name);
	//星の表示
	for (int i = 0; i < sz->starnum; i++) {
		gpoint(sz->stars[i].x, sz->stars[i].y,
			sz->stars[i].magnitude * 2);
	}
	for (int i = 0; i < sz->linenum; i++) {
		int sp = sz->lines[i].startpt;
		int ep = sz->lines[i].endpt;
		gline(sz->stars[sp].x, sz->stars[sp].y,
			sz->stars[ep].x, sz->stars[ep].y);
	}

}