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

#define LAYOVER_PREFIX "1 stop in "
/*#define DEBUG_LOGGING */

int get_file_size(FILE *f);

int main(int argc, char **argv)
{
    int i;

    if (argc < 2)
        quit("SYNTAX: findlinks filename [filenames] (needs to be a google flights result page html)\n");

    debug("Processing %d files\n.", argc - 1);

    for (i = 1; i < argc; i += 2)
    {
        FILE *f;
        char *file_data, *pos;
        int file_size;

        debug("Reading file %s\n.", argv[i]);
        
        if (!(f = fopen(argv[i], "r"))) 
            quit("Can't open file %s, exiting.\n", argv[i]);

        debug("Succesfully opened file. Reading file size.\n");
        
        if ((file_size = get_file_size(f)) == -1)
        {
            quit("Can't get file size for file %s, exiting.\n", argv[i]);
        }
        
        debug("File size: %d\n", file_size);
        
        if (!(file_data = malloc(file_size + 1)))
            quit("Can't allocate %d bytes for file %s, exiting.\n", file_size, argv[i]);

        debug("Allocated %d byes.\n", file_size);

        if (fread(file_data, file_size, 1, f) != 1) 
            quit("Can't read %d bytes for file %s, exiting.\n", file_size, argv[i]);

        debug("Read %d bytes.\n", file_size);

        file_data[file_size] = '\0';        

        pos = file_data;

        while (pos = strstr(pos, LAYOVER_PREFIX))
        {
            char *layover_code_loc = pos + strlen(LAYOVER_PREFIX), *match_pos, dst_code[3], *dest_loc;
            char layover_code[3]; 
            struct layover_airport *layover = find_layover(layover_code_loc);
            char search_str[] = ",XXX-";
            
            int i;

            debug("Found layover %0.3s.\n", layover_code);

            if (!layover) quit("Can't load layover airport.\n");
            layover_code[0] = layover_code_loc[0];
            layover_code[1] = layover_code_loc[1]; 
            layover_code[2] = layover_code_loc[2];

            /* Now find final destination */
            search_str[1] = layover_code[0];
            search_str[2] = layover_code[1];
            search_str[3] = layover_code[2];

            if (!(match_pos = strstr(pos, search_str)))
            {
                error("Couldn't find final destination for %.3s\n", search_str + 1);
                goto doneloop;
            }

            dest_loc = match_pos + strlen(search_str);
            dst_code[0] = dest_loc[0];
            dst_code[1] = dest_loc[1];
            dst_code[2] = dest_loc[2];
            debug("...associated with dst_code %0.3s\n", dst_code);

            for (i = 0; i < layover->num_dests; i++)
            {
                if (!strncmp(dst_code, layover->final_dests[i].code, 3))
                    goto done_dest;
            }
            
            if (i >= MAX_DESTS)
            {
                quit("Too many final dests for layover airport %0.3s, we only support %d.\n", layover_code, MAX_DESTS);
            }

            layover->final_dests[i].code[0] = dst_code[0];
            layover->final_dests[i].code[1] = dst_code[1];
            layover->final_dests[i].code[2] = dst_code[2];            
            layover->num_dests++;
            error("Added destination %.3s to layover %.3s\n", dst_code, layover_code);

            done_dest:
            layover->final_dests[i].count++;            

            /* Advance one character so we can find the next layover */
            doneloop:
            pos++;
        }

        free(file_data);
    }    

    /* Now output the lists */    
    printf("%d\n", num_layovers);
    for (i = 0; i < num_layovers; i++)
    {
        int j;
        printf("%.3s\n%d\n", layover_airports[i].code, layover_airports[i].num_dests);        
        for (j = 0; j < layover_airports[i].num_dests; j++)
        {
            printf("    %.3s\n%d\n", layover_airports[i].final_dests[j].code, layover_airports[i].final_dests[j].count);
        }
    }
}

int get_file_size(FILE *f)
{
    int size;
    if (fseek(f, 0, SEEK_END)) return -1;
    if ((size = ftell(f)) == -1) return -1;
    if (fseek(f, 0, SEEK_SET)) return -1;
    return size;
}

