
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Test value
bool test_value(int* array, int dim, int i, int j)
{

    // TODO: Current does not support multiple edges between two vertices
    if (array[i * dim + j] != -1) {
        // fprintf(stderr, "Possibly duplicate records at (%d, %d)\n", i, j);
        return 0;
    } else
        return 1;
}

// Set value (i, j) = value
void set_value(int* array, int dim, int i, int j, int value)
{
    array[i * dim + j] = value;
}

int* parse_graph_file(int *num_nodes, int *num_edges, char* tmpchar)
{

    int *adjmatrix;
    int cnt = 0;
    unsigned int lineno = 0;
    char line[128], sp[2], a, p;

    FILE *fptr;

    fptr = fopen(tmpchar, "r");

    if (!fptr) {
        fprintf(stderr, "Error when opening file: %s\n", tmpchar);
        perror("fopen Error:");
        exit(1);
    }

    printf("Opening file: %s\n", tmpchar);

    while (fgets(line, 100, fptr)) {
        int head, tail, weight;
        long long unsigned size;
        switch (line[0]) {
        case 'c':
            break;
        case 'p':
            sscanf(line, "%c %s %d %d", &p, sp, num_nodes, num_edges);
            printf("Read from file: num_nodes = %d, num_edges = %d\n", *num_nodes, *num_edges);
            size = (long long unsigned)(*num_nodes + 1) * (long long unsigned)(*num_nodes + 1);
            if (size > UINT_MAX) {
                fclose(fptr);
                fprintf(stderr, "ERROR: Too many nodes, huge adjacency matrix\n");
                exit(0);
            }
            adjmatrix = (int *)malloc(size * sizeof(int));
            memset(adjmatrix, -1 , size * sizeof(int));
            break;
        case 'a':
            sscanf(line, "%c %d %d %d", &a, &head, &tail, &weight);
            if (tail == head) printf("reporting self loop\n");
            if (test_value(adjmatrix, *num_nodes + 1, head, tail)) {
                set_value(adjmatrix, *num_nodes + 1, head, tail, weight);
                cnt++;
            }

#ifdef VERBOSE
            printf("Adding edge: %d ==> %d ( %d )\n", head, tail, weight);
#endif
            break;
        default:
            fprintf(stderr, "exiting loop\n");
            break;
        }
        lineno++;
    }

    *num_edges = cnt;
    printf("Actual added edges: %d\n", cnt);

    fclose(fptr);

    return adjmatrix;

}
