#include "game.h"
#include <time.h>
#include <stdlib.h>
#include <string.h>

#define MAX_RAND_TRIES_PER_WORD 10
#define EMPTY_CHAR 0

//TODO: Spiellogik implementieren:
/* * Wörter aus der Wortliste zufällig horizontal oder vertikal platzieren
   * restliche Felder mit zufälligen Buchstaben füllen */

// Creates the word salad by placing words randomly and filling empty spaces
int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen, const char words[][MAX_WORD_LEN], unsigned int wordCount)
{

   srand((unsigned int)time(NULL)); // Seed für Zufallsgenerator


   // Initialisiere das Spielfeld
   for (unsigned int i = 0; i < searchFieldLen; ++i)
   {
      for (unsigned int j = 0; j < searchFieldLen; ++j)
      {
         salad[i][j] = EMPTY_CHAR;
      }
   }

   unsigned int placedWords = 0;  // Zähler für die Anzahl platzierter Wörter für spätere Überprüfung

   for (unsigned int word = 0; word < wordCount; ++word)
   {
      int placed = 0;  //Flag um zu kennzechneinen, ob ein Wort platziert worden ist oder nicht
      for (int tries = 0; tries < MAX_RAND_TRIES_PER_WORD && !placed; ++tries)
      {
        // Festlegen der Parameter zum Platzieren des Worts
         int direction = rand() % 2; // 1 = horizontal, 0 = vertical
         int row = rand() % searchFieldLen;
         int col = rand() % searchFieldLen;
         int len = (int)strlen(words[word]);

         // prüfen, ob das Wort horizontal in die Tabelle passt
         if (direction == 1 && col + len <= searchFieldLen)
         {
            int canPlace = 1;  // Flag um zu kennzeichnen, dass das Wort platziert werden kann
            for (int i = 0; i < len; ++i)
            {

                // Wenn in den Feldern schon andere Buchstaben stehen, kann das Feld nicht platziert werden
               if (salad[row][col + i] != EMPTY_CHAR && salad[row][col + i] != words[word][i])
               {
                  canPlace = 0;
                  break;
               }
            }
               // Wenn das Wort platziert werden kann, wird es platziert
            if (canPlace)
            {
               for (int i = 0; i < len; ++i)
                  salad[row][col + i] = words[word][i];
               placed = 1;
            }
         }
         // prüfen, ob das Wort vertikal in die Tabelle passt
         else if (direction == 0 && row + len <= searchFieldLen) // vertical
         {
            int canPlace = 1;// Flag um zu kennzeichnen, dass das Wort platziert werden kann
            for (int i = 0; i < len; ++i)
            {
               // Wenn in den Feldern schon andere Buchstaben stehen, kann das Feld nicht platziert werden
               if (salad[row + i][col] != EMPTY_CHAR && salad[row + i][col] != words[word][i])
               {
                  canPlace = 0;

                  break;
               }
            }
             // Wenn das Wort platziert werden kann, wird es platziert
            if (canPlace)
            {
               for (int i = 0; i < len; ++i)
                  salad[row + i][col] = words[word][i];
               placed = 1;
            }
         }
      }
 	  // Zähler hochzählen, wenn ein Wort platziert wurde
      if (placed)
         placedWords++;
   }

   // Fülle leere Felder mit zufälligen Buchstaben
   for (unsigned int i = 0; i < searchFieldLen; ++i)

   {
      for (unsigned int j = 0; j < searchFieldLen; ++j)
      {
         if (salad[i][j] == EMPTY_CHAR)
         {
            salad[i][j] = 'A' + (rand() % 26);
         }
      }
   }

   return placedWords;

}

// Prints the word salad to console
void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen)
{

   for (unsigned int i = 0; i < searchFieldLen; ++i)
   {
      for (unsigned int j = 0; j < searchFieldLen; ++j)
      {
         printf("%c ", salad[i][j]);
      }
      printf("\n");
   }
}
