#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)
{
   // set seed
   // showWordSalad(salad, 20);

   for (int i = 0; i < MAX_SEARCH_FIELD_LEN; i++)
   {
      for (int j = 0; j < MAX_SEARCH_FIELD_LEN; j++)
      {
         salad[i][j] = '\0';
      }
   }


   showWordSalad(salad, 20);
   srand(time(NULL));

   int wordsPlaced = 0;

   // loop through all words
   for (int n = 0; n < wordCount; n++)
   {
      int checkSquare, letterPlaced, retries = 0;
      int wordLength = strlen(words[n]);

      // get random coordinates
      int rndX = rand() % (searchFieldLen - wordLength + 1);
      int rndY = rand() % (searchFieldLen - wordLength + 1);
// rand() % 2
      if (1)
      {
         while (letterPlaced < wordLength)
         {
            // checks if word fits into gamefield
            while (checkSquare != wordLength && retries < 10)
            {
               checkSquare = 0;
               // checks if squares to paste into is already taken
               for (int x = rndX; x < (rndX + wordLength); x++)
               {
                  if (salad[rndY][x] == '\0')
                     checkSquare++;
               }

               // new coords when doesnt fit
               if (checkSquare != wordLength)
               {
                  rndX = rand() % (searchFieldLen - wordLength + 1);
                  rndY = rand() % (searchFieldLen - wordLength + 1);

                  // retries++;
               }
            }

            if (retries >= 10)
            {
               printf("Word %d couldn't be placed", n);
               break;
            }
            printf("%d %d",n, checkSquare);
            // pastes word into the line
            if (checkSquare == wordLength)
            {
               for (int x = 0; x < wordLength; x++)
               {
                  salad[rndY][rndX + x] = words[n][x];
                  letterPlaced++;
               }
            }
         }
         wordsPlaced++;

      }
      else
      {
         while (letterPlaced < wordLength)
         {
            // checks if word fits into gamefield
            while (checkSquare != wordLength && retries < 10)
            {
               checkSquare = 0;
               // checks if squares to paste into is already taken
               for (int y = rndY; y < (rndY + wordLength); y++)
               {
                  if (salad[y][rndX] == '\0')
                     checkSquare++;
               }

               // new coords when doesnt fit
               if (checkSquare != wordLength)
               {
                  rndX = rand() % (searchFieldLen - wordLength + 1);
                  rndY = rand() % (searchFieldLen - wordLength + 1);

                  retries++;
               }
            }

            if (retries >= 10)
            {
               printf("Word %u couldn't be placed", n);
               break;
            }

            // pastes word into the line
            if (checkSquare == wordLength)
            {
               for (int y = 0; y < wordLength; y++)
               {
                  salad[y + rndY][rndX] = words[n][y];
                  letterPlaced++;
               }
            }
         }
         wordsPlaced++;
      }
   }

   //fill voids
   for(int x = 0; x < searchFieldLen; x++)
   {
      for(int y = 0; y < searchFieldLen; y++)
      {
         if(salad[y][x] == '\0')
         {
            // random number from 65 (A) to 90 (Z) with ASCII 
            // salad[y][x] = (char) (rand() % (25 + 1) + 65);
            salad[y][x] = 120;
         } 
      }
   }
   return 15;
}

// Prints the word salad to console
void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen)
{
   int i, j = 0;
   for (i = 0; i < searchFieldLen; i++)
   {
      for (j = 0; j < searchFieldLen - 1; j++)
      {
         printf(" %c,", salad[i][j]);
      }

      printf(" %c\n", salad[i][searchFieldLen]);
   }
}

// Clear Wordsalad
void clearWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int searchFieldLen)
{
   int i, j = 0;
   for (i = 0; i < searchFieldLen; i++)
   {
      for (j = 0; j < searchFieldLen; j++)
      {
         salad[i][j] = '\0';
      }
   }
}