/** @license 2023 Neil Edelman, distributed under the terms of the
 [MIT License](https://opensource.org/licenses/MIT).

 Date _vs_ hours flown. */

#include "flights.h"
#include "source.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <errno.h>
#include <inttypes.h>

int main(void) {
	int success = EXIT_SUCCESS;
	errno = 0;
	struct journal j = journal();
	struct sources s = sources(&j);
	struct flight_tree f = flights(&j);

	if(errno) goto catch;
	fprintf(stderr, "Journal: %s.\n"
		"Flights: %s.\n", journal_to_string(&j), flights_to_string(&f));
	printf("set terminal pngcairo dashed transparent truecolor"
		" size 840, 480 fontscale 1\n"
		"set output \"flight.png\"\n");
	/*printf("set terminal cairolatex standalone pdf size 16cm,10.5cm"
		" dashed transparent\n"
		"set output \"flight.tex\"\n");*/
	/*printf("set term postscript eps enhanced\n"
		"set output \"flighthours.eps\"\n");*/
	printf("$Data <<EOD\n"
		"# date, reg, sic, pic, source\n");
	struct flight_tree_iterator it = flights_iterator(&f);
	union line64 line;
	const struct flight *flight;
	while(flights_next(&it, &line, &flight)) {
		char datestr[12];
		date32_to_string(line.date, &datestr);
		const struct source *src = source_lookup(&s, line);
		assert(src); if(!src->name.a) { errno = EDOM; goto catch; }
		printf("%s, ", datestr);
		assert(flight); switch(flight->type) {
		case GLIDER:
			printf("%.*s, %" PRIu32 ", %" PRIu32,
				(int)(flight->glider.reg.b - flight->glider.reg.a),
				flight->glider.reg.a,
				flight->glider.dual_min,
				flight->glider.pilot_min + flight->glider.instr_min);
			break;
		case POWER:
			printf("%.*s, %" PRIu32 ", %" PRIu32,
				(int)(flight->power.reg.b - flight->power.reg.a),
				flight->power.reg.a,
				flight->power.dual_min,
				flight->power.pilot_min);
			break;
		}
		printf(", %.*s\n", (int)(src->name.b - src->name.a), src->name.a);
	}
	printf("EOD\n"
		"# theozh https://stackoverflow.com/a/75466214/2472827\n"
		"# get a unique list from datablock\n"
		"addToList(list,col) = list.( strstrt(list,'\"'.strcol(col).'\"') \\\n"
		" > 0 ? '' : ' \"'.strcol(col).'\"')\n"
		"Uniqs = ''\n"
		"stats $Data u (Uniqs=addToList(Uniqs,2)) nooutput\n"
		"Uniq(i) = word(Uniqs,i)\n"
		"getIndex(s) = sum [_i=1:words(Uniqs)] s eq word(Uniqs,_i) ? _i : 0\n"
		"\n"
		"stats $Data u 3 nooutput\n"
		"sicsum = STATS_sum\n"
		"stats $Data u 4 nooutput\n"
		"picsum = STATS_sum\n"
		"\n"
		"myTimeFmt = \"%%Y-%%m-%%d\"\n"
		"set format x myTimeFmt timedate\n"
		"set xtics format myTimeFmt rotate by -30\n"
		"set format y \"%%tH:%%tM\" timedate\n"
		"set grid\n"
		"set key out reverse Left noautotitle\n"
		"set style fill solid 0.5\n"
		"unset border\n"
		"plot total=0 $Data u"
		" (timecolumn(1,myTimeFmt)):(dy=($3+$4)*60,total=total+dy)"
		" w steps lc \"black\" dt 3, \\\n"
		" total=0 '' u (timecolumn(1,myTimeFmt)):"
		"(dy=($3+$4)*60,total=total+dy,total/2.): \\\n"
		" (43200):(total/2.):(getIndex(strcol(2))) w boxxy lc var, \\\n"
		" for [i=1:words(Uniqs)] keyentry w boxxy lc i ti Uniq(i)\n"
		/*"set xrange [*:'2001-09-11']\n"*/
		/*"#set style fill solid 0.1 #pattern 5 (better, but restarts)\n"
		"plot $Data using 1:($6/60) with fillsteps lw 2\n"*/);
	goto finally;
catch:
	success = EXIT_FAILURE;
	perror("flights");
finally:
	flights_(&f);
	sources_(&s);
	journal_(&j);
	return success;
}
