#include <stdio.h>
#include <string.h>
#include <time.h>

#include "ecriture.h"

/* pour éviter le warning, je ne sais pas comment faire autrement : */
extern struct tm *localtime_r(time_t *, struct tm *);

int genere_fichier(char *nom_fichier,
                   char *params,
                   int total_cellules,
                   int total_liens,
                   cell * tabcell, char *buffer_erreur, int maxlen_erreur)
{
    FILE *houtput;
    int i, j;
    time_t mytime;
    struct tm mytm;
    char *p;

    /* variable de retour, par défaut = ok */
    int ret = 0;

    /* ouverture ecriture fichier */
    houtput = fopen(nom_fichier, "wb+");
    if (houtput == NULL) {
        snprintf(buffer_erreur, maxlen_erreur,
                 "Erreur d'ouverture en écriture du fichier <%s>.\n",
                 nom_fichier);
        return -1;
    }

    time(&mytime);
    localtime_r(&mytime, &mytm);

    fprintf(houtput, "; -------------------------------\n");
    fprintf(houtput, "; fichier généré le %d/%d/%d à %02d:%02d\n\n",
            mytm.tm_mday, mytm.tm_mon + 1, mytm.tm_year + 1900,
            mytm.tm_hour, mytm.tm_min);

    /* on fait suivre les paramètres fichier d'origine */
    fprintf(houtput, "; -------------------------------\n");
    fprintf(houtput,
            "; on fait suivre les paramètres fichier d'origine :\n");
    p = params;
    while (*p) {
        fprintf(houtput, "params:");
        while (*p != ' ') {
            fprintf(houtput, "%c", *p);
            p++;
            if (!*p) {
                break;
            }
        }
        fprintf(houtput, "\n");
        if (*p == ' ') {
            p++;
        }
    }
    fprintf(houtput, "\n");

    fprintf(houtput, "; ---------------------\n");
    fprintf(houtput, "; nombre de cellules :\n");
    fprintf(houtput, ";\n");
    fprintf(houtput, "total_cells:%d\n", total_cellules);
    fprintf(houtput, "\n");
    fprintf(houtput, "; ---------------------\n");
    fprintf(houtput, "; nombre de liens :\n");
    fprintf(houtput, "total_links:%d\n\n", total_liens);

    fprintf(houtput, "; ---------------------\n");
    fprintf(houtput, "; rappel :\n");
    fprintf(houtput, "; - 'p' : ouverture (p=path),\n");
    fprintf(houtput, "; - 'w' : mur (w=wall).\n");
    fprintf(houtput, ";\n");
    fprintf(houtput, "; syntaxe : \n");
    fprintf(houtput,
            "; [numéro de cellule] : [p|w] = [cellule destination] { / [tag cellule (une seule fois)] }.\n");
    fprintf(houtput, "\n");
    fprintf(houtput, "; -----------\n");
    fprintf(houtput, "; toutes les ouvertures :\n");
    fprintf(houtput, "\n");
    for (i = 0; i < total_cellules; i++) {
        for (j = 0; j < tabcell[i].nb_paths; j++) {
            fprintf(houtput, "%d:p=%lu", i + 1,
                    tabcell[i].paths[j].link->no + 1);
            if (j == 0) {
                fprintf(houtput, "/%lu", tabcell[i].tag);
            }
            fprintf(houtput, "\n");
            if (j == (tabcell[i].nb_paths - 1))
                fprintf(houtput, "\n");
        }
    }

    fprintf(houtput, "\n");
    fprintf(houtput, "; -----------\n");
    fprintf(houtput, "; tous les murs :\n");
    fprintf(houtput, "\n");
    for (i = 0; i < total_cellules; i++) {
        for (j = 0; j < tabcell[i].nb_walls; j++) {
            fprintf(houtput, "%d:w=%lu\n", i + 1,
                    tabcell[i].walls[j].link->no + 1);
            if (j == (tabcell[i].nb_walls - 1))
                fprintf(houtput, "\n");
        }
    }

    fclose(houtput);
    return ret;
}
