/**
 *   \file utilities.c
 *   \brief Implémentation des fonctions utilitaires
 *
 *  Dans ce fichier sont implémentées les fonctions utilitaires pour la
 *  manipulation des structures de données déclarées dans le fichier header
 *  correspondant.
 */

#include "utilities.h"

/**
 *  Créé un nouveau pixel initialisé avec les arguments `r`, `g` et `b` et
 *  renvoie un pointeur vers ce pixel créé.
 *
 *  \param[in] t_r Valeur rouge du pixel
 *  \param[in] t_g Valeur verte du pixel
 *  \param[in] t_b Valeur bleue du pixel
 *  \return Pointeur sur une structure de type \ref Pixel
 */
Pixel *newPixel(uint8_t t_r, uint8_t t_g, uint8_t t_b) {
  Pixel *res;
  res = (Pixel *)malloc(sizeof(Pixel));
  res->red = t_r;
  res->green = t_g;
  res->blue = t_b;
  res->visited = 0;
  return res;
}

/**
 *  Constructeur d’un conteneur d’image. Les dimensions sont initialisées à zéro
 *  (0) et son tableau de pixels a été créé et initialisé en tableau vide. Le
 *  constructeur renvoie un pointeur vers la nouvelle structure \ref Image.
 *
 *  \return Pointeur vers une structure \ref Image initialisée.
 */
Image *newImage() {
  Image *res;
  res = (Image *)malloc(sizeof(Image));
  res->sizeX = 0;
  res->sizeY = 0;
  res->pixels = darrayNew(sizeof(Pixel));
  return res;
}

/**
 *  Destructeur d’un conteneur d’image. Le destructeur appellera le destructeur
 *  du vecteur de pixels qui sera libéré de la mémoire, puis ultimement le
 *  destructeur libérera la structure \ref Image pointée par le pointeur passé
 *  en argument.
 *
 *  \param[in] t_self Conteneur d’image à détruire
 */
void deleteImage(Image *t_self) {
  darrayDelete(t_self->pixels);
  free(t_self);
}

/**
 *  Constructeur d’un conteneur de segment. Le constructeur va initialiser les
 *  valeurs qu’il contiendra avec les arguments qui lui seront passés lors de
 *  l’appel de la fonction.
 *
 *  \param[in] t_right_limit Abscisse extrême droite du segment
 *  \param[in] t_left_limit Abscisse extrême gauche du segment
 *  \return Pointeur sur un conteneur de segment
 */
Segment *newSegment(uint32_t t_right_limit, uint32_t t_left_limit) {
  Segment *res = (Segment *)malloc(sizeof(Segment));
  res->left_limit = t_left_limit;
  res->right_limit = t_right_limit;
  return res;
}

/**
 *  \brief function description
 *
 *  Constructeur de conteneur de zone, initialise grâce aux arguments la couleur
 *  de la zone et initialise un tableau dynamique vide de \ref Segment. Renvoie
 *  un pointeur vers la structure nouvellement créée.
 *
 *  \param[in] t_r Valeur rouge de la couleur de la zone
 *  \param[in] t_g Valeur verte de la couleur de la zone
 *  \param[in] t_b Valeur bleue de la couleur de la zone
 *  \return Pointeur vers la structure créée
 */
Zone *newZone(uint8_t t_r, uint8_t t_g, uint8_t t_b) {
  Zone *res = (Zone *)malloc(sizeof(Zone));
  res->red = t_r;
  res->green = t_g;
  res->blue = t_b;
  res->segments = darrayNew(sizeof(Segment));
  return res;
}
