/* gcc `pkg-config --cflags --libs libical` ical.c -g -O0 -o ical && ./ical */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libical/ical.h>

int main (int argc, char *argv[])
{
	icalarray *builtin_timezones;
	icaltimetype tt;
	int dd, hh, zz, zz2 = -1, tried = 0;

	tt = icaltime_current_time_with_zone (icaltimezone_get_builtin_timezone ("America/New_York"));

	tt.year = 2038;
	icaltime_as_timet_with_zone (tt, icaltimezone_get_builtin_timezone ("PST"));
	tried++;

	tt.year = 2050;
	icaltime_as_timet_with_zone (tt, icaltimezone_get_builtin_timezone ("PST"));
	tried++;

	tt.year = 1958;
	icaltime_as_timet_with_zone (tt, icaltimezone_get_builtin_timezone ("PST"));
	tried++;

	builtin_timezones = icaltimezone_get_builtin_timezones ();
	printf ("got %d zones\n", builtin_timezones->num_elements);
	for (zz = -1; zz < (int) builtin_timezones->num_elements; zz++) {
		icaltimezone *zone;

		if (zz < 0)
			zone = icaltimezone_get_utc_timezone ();
		else
			zone = icalarray_element_at (builtin_timezones, zz);

		tt = icaltime_current_time_with_zone (zone);

		for (dd = 0; dd < 370; dd += 17) {
			for (hh = 0; hh < 60 * 60 * 24; hh += 567) {
				int zz2cnt;

				icaltime_adjust (&tt, 0, 0, 0, 1);

				for (zz2cnt = 0; zz2cnt < 15; zz2cnt++) {
					icaltimezone *zone2;

					if (zz2 < 0)
						zone2 = icaltimezone_get_utc_timezone ();
					else
						zone2 = icalarray_element_at (builtin_timezones, zz2);

					icaltime_as_timet_with_zone (tt, zone2);
					tried++;

					zz2++;
					if (zz2 >= builtin_timezones->num_elements)
						zz2 = -1;
				}
			}
		}

		printf ("\r%d %% done", (zz >= 0 ? zz : 0) * 100 / builtin_timezones->num_elements);
		fflush (stdout);
	}

	printf ("\ntried %d times\n", tried);
	return 0;
}