#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "destlib.h"

struct layover_airport layover_airports[MAX_LAYOVER_AIRPORTS] = {0};
int num_layovers = 0;

int read_layovers(char *filename);

struct dest *get_dests(char layover_code[3])
{
    struct layover_airport *layover;
    struct dest *dests;
    int i;
    if (num_layovers == 0)
        read_layovers("layovers.txt");

    if (!(layover = find_layover(layover_code)))
        quit("Couldn't find layover airport %.3s\n", layover_code);

    if (!(dests = malloc(sizeof(struct dest) * (layover->num_dests + 1))))
    {
        quit("Couldn't allocate memory for dests, quitting\n");
    }

    for (i = 0; i < layover->num_dests; i++)
    {
        dests[i].code[0] = layover->final_dests[i].code[0];
        dests[i].code[1] = layover->final_dests[i].code[1];
        dests[i].code[2] = layover->final_dests[i].code[2];
    }
    dests[i].code[0] = '\0';
    dests[i].code[1] = '\0';
    dests[i].code[2] = '\0';
    return dests;
}

struct layover_airport *find_layover(char code[3])
{
    int i;
    for (i = 0; i < MAX_LAYOVER_AIRPORTS; i++)
    {
        if (layover_airports[i].code[0] == '\0' ||
            (!strncmp(layover_airports[i].code, code, 3)))
        {
            layover_airports[i].code[0] = code[0];
            layover_airports[i].code[1] = code[1];
            layover_airports[i].code[2] = code[2];
            if (i >= num_layovers) num_layovers++;
            return &layover_airports[i];
        }
    }
    printf("Too many layover airports! We only support %d layover airports.\n", MAX_LAYOVER_AIRPORTS);
    exit(0);
}

int read_layovers(char *filename)
{
    FILE *f;    
    char line[256];
    int num_layover_airports, i;

    if (!(f = fopen(filename, "r"))) 
        quit("Couldn't open file %s, quitting\n", filename);
            
    if (1 != fscanf(f, "%d", &num_layover_airports))
    {
        fclose(f);
        quit("Couldn't read number of layers, quitting\n");
    }

    if (num_layover_airports > MAX_LAYOVER_AIRPORTS)
    {
        fclose(f);
        quit("Too many layover airports (%d) - max is %d.\n", num_layover_airports, MAX_LAYOVER_AIRPORTS);
    }

    if (num_layover_airports == 0)
    {
        fclose(f);
        quit("No layover airports!\n");
    }

    for (i = 0; i < num_layover_airports; i++)
    {
        int j;

        if (1 != fscanf(f, "    %3s", layover_airports[i].code))
        {
            fclose(f);
            quit("Couldn't read layover airport code, quitting.\n");
        }

        if (1 != fscanf(f, "%d", &layover_airports[i].num_dests))
        {
            fclose(f);
            quit("Couldn't read layover num dests, quitting.\n");
        }

        if (layover_airports[i].num_dests > MAX_DESTS)
        {
            fclose(f);
            quit("Too many destinations, quitting.\n");
        }

        if (layover_airports[i].num_dests == 0)
        {
            fclose(f);
            quit("No destinations quitting.\n");
        }

        for (j = 0; j < layover_airports[i].num_dests; j++)
        {
            if (1 != fscanf(f, "%3s", layover_airports[i].final_dests[j].code))
            {
                fclose(f);
                quit("Couldn't read final dest code, quitting\n");
            }
            if (1 != fscanf(f, "%d", &layover_airports[i].final_dests[j].count))
            {
                fclose(f);
                quit("Couldn't read final dest count, quitting\n");
            }
        }
    }

    debug("Number of layers: %d\n", num_layover_airports);

    fclose(f);
    return 1;
}

void quit(char *msg, ...)
{
    va_list vargs;
    va_start(vargs, msg);
    debug_print(msg, vargs);
    if (msg[strlen(msg)-1] != '\n') putchar('\n');
    va_end(vargs);
    exit(0);
}

void debug(char *msg, ...)
{
    #ifdef DEBUG_LOGGING
    va_list vargs;
    va_start(vargs, msg);
    debug_print(msg, vargs);
    va_end(vargs);
    #endif
}

void error(char *msg, ...)
{
    va_list vargs;
    va_start(vargs, msg);
    debug_print(msg, vargs);
    va_end(vargs);
}

void debug_print(char *msg, va_list vargs)
{
    vfprintf(stderr, msg, vargs);
    /* if (msg[strlen(msg)-1] != '\n') putchar('\n'); */
    fflush(stdout);
}
