#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <stdbool.h>

#include "common.h"

/* distance : calcule la distance approchée entre deux villes 
à partir de leurs coordonnées géogrphiques */
float dist(node n, node m) {
    return 107 * sqrt(pow(n.x-m.x,2) + pow(n.y-m.y,2));
}

node* lireFichier(const char* filename, int* n) {
    FILE* f = fopen(filename, "r");
    if (f != NULL) {
        if (fscanf(f, "%d\n", n) == 1){
            node* villes = malloc(*n * sizeof(node));
            for (int i = 0; i < *n; i += 1) {
                node v;
                if (fscanf(f, "%s %d %f %f\n", v.nom, &v.hab, &v.x, &v.y) == 4) {
                    villes[i] = v;
                } else {
                    exit(0); // erreur de lecture
                    return NULL;
                }
            }
            fclose(f);
            return villes;
        }
    }
    exit(0); // erreur de lecture
    return NULL;
}

edge* creerAretes(node* villes, int nv, int* na){
    *na = (nv * (nv - 1)) / 2;
    edge* aretes = (edge*) malloc(*na * sizeof(edge));
    assert(aretes != NULL);
    int c = 0;
    for (int i = 0; i < nv; i += 1){
        for (int j = i + 1; j < nv; j += 1){
            aretes[c].i = i;
            aretes[c].j = j;
            aretes[c].d = dist(villes[i], villes[j]);
            aretes[c].selected = false;
            c += 1;
        }
    }
    return aretes;
}

void exporter(const char* filename, edge* aretes, int na, node* villes, int nv){
    FILE* f = fopen(filename, "w");
    fprintf(f,"{\"type\": \"FeatureCollection\",\"features\": [\n");
    bool first = true;
    for (int i = 0; i < na; i += 1) {
        edge e = aretes[i];
        if (e.selected) {
            if (!first) {
                fprintf(f, ",");
            }
            fprintf(f, "{\"type\": \"Feature\", \"geometry\": {\"type\": \"LineString\",");
            fprintf(f,  "\"coordinates\": [[%f, %f], [%f, %f]]}}\n", 
                    villes[e.i].x, villes[e.i].y, villes[e.j].x, villes[e.j].y);
            first = false;
        }
    }
    fprintf(f,"]}");
    fclose(f);
}