//
// Created by titou on 28/11/2024.
//
#ifndef PROJET_RESEAUX_TROPHIQUES_EQUIPE_3B_INFOGRAPHE_H
#define PROJET_RESEAUX_TROPHIQUES_EQUIPE_3B_INFOGRAPHE_H
#include <stdlib.h>
#include "cJSON.h"
#define INFINI 1000000
enum TypeEspece {
INCONNU = 0,
PRODUCTEUR_PRIMAIRE = 1,
CONSOMMATEUR_PRIMAIRE = 2,
CONSOMMATEUR_SECONDAIRE = 3,
CONSOMMATEUR_TERTIAIRE = 4
};
typedef struct {
int id;
char* name;
char* couleur;
int type_espece;
double * population;
double tCroissance;
int vivante;
} espece;
typedef struct {
int nbSommets;
char** noms;
char * ecosysteme;
int** capacites;
espece * tabEspece;
} Graphe;
// Lire le contenu d'un fichier
char* lireFichier(const char* nomFichier);
int determinerTypeEspece(Graphe *graphe, int especeIndex, espece * espece1);
// Créer le graphe avec les espèces à partir du JSON
Graphe* creerGrapheAvecEspeces(cJSON * json);
// Afficher le graphe
void afficherGraphe(Graphe* graphe);
// Libérer la mémoire du graphe
void libererGraphe(Graphe* graphe);
// Liberer la mémoire des esoeces
void libererEspeces(espece* especes);
//Donner le nom du type de l'espece
const char* obtenirNomTypeEspece(int type);
//Affichage de la complexité
void afficherComplexiteReseau(Graphe* graphe);
//mesure du nivau trophique
int calculerHauteurTrophique(Graphe* graphe);
//Calcul de la desnité de liaison
double calculerDensiteLiaison(Graphe* graphe);
//Afficher la distrib de degrée
void afficherDistributionDegres(Graphe* graphe);
int* obtenirDegresSortants(Graphe* graphe);
int* obtenirDegresEntrants(Graphe* graphe);
//Recherche de sommet particulier
void AffichageSommetSpecifique(Graphe* graphe);
void affichageSommPart(Graphe* graphe);//Fonction global pour toute la rubrique de l'affichage des sommet particulier (la seul à utiliser)
void RechercheSommetPart(Graphe* graphe,int nbdegresSortant, int nbdegresEntrant);
void RechercheSansPredateur(Graphe* graphe);
void RechercheProducteurPrimaire(Graphe* graphe);
//Etude de la hauteur trophique d'une espece
void construireChaineAlimentaire(Graphe* graphe, int especeIndex, char* base, int* niveauTrophique, int niveau);
void afficherChainesAlimentaires(Graphe* graphe, const char* nomEspece);
void AnalyseHauteurTrophique(Graphe* graphe);
//Rubrique analyse de la conexité
int** creerMatriceNonOriente(Graphe* graphe);
int estConnexe(Graphe* graphe);
int estConnexeApresSuppression(Graphe* graphe, int* sommetsSuppr, int nbSuppr);
int calculerKConnexite(Graphe* graphe);
void afficherAnalyseConnexite(Graphe* graphe);
#endif //PROJET_RESEAUX_TROPHIQUES_EQUIPE_3B_INFOGRAPHE_H