#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include "Cities.h"
#include "SoloCType.h"
#include "GetCity.h"
#include "Solomite.h"

static int numOfCities = -1;

int MyStrNCmp(const char *d, const char *s) {
    while (ToLower(*s) == ToLower(*d) && *s) {
	while (*(++s) == ' ');
	while (*(++d) == ' ');
    }
    return ToLower(*d) - ToLower(*s);
}

int cmpCitiesBSearch(const void *strV, const void *tabV) {
    return MyStrNCmp(strV, ((struct CITY *)tabV)->name);
}

int cmpCitiesQSort(const void *s1, const void *s2) {
    return MyStrNCmp(((struct CITY *)s1)->name, ((struct CITY *)s2)->name);
}


const struct CITY *GetDefaultCity(void) {
    return GetCity("Tampere");
}

static void CheckValidity(void) {
    if (numOfCities == -1) {
	while (cities[++numOfCities].latitude != END_CITY); /* empty loop */
	qsort(cities, numOfCities, sizeof(struct CITY), cmpCitiesQSort);
    }
}

const struct CITY *GetCity(const char *name) {
    CheckValidity();
    return bsearch(name, cities, numOfCities, sizeof(struct CITY),
		   cmpCitiesBSearch);
}

void PrintCities(void) {
    int i;
    CheckValidity();
    for (i=0; i<numOfCities; i++) {
	BOOL neg = (cities[i].timeZone < 0) ? TRUE : FALSE;
	int tz = neg ? -cities[i].timeZone : cities[i].timeZone;
	printf("%6.2f°N %7.2f°E  TZ:%c%02d.%02d  %s\n",
	       cities[i].latitude, cities[i].longitude,
	       (neg ? '-' : '+'), tz / 3600, (tz / 60) % 60, cities[i].name);
    }
}
