#include "game.h"
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.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(time(NULL));
   int placedWords = 0;

   // Array mit . füllen
   for (int r = 0; r < searchFieldLen; r++){
      for(int s = 0; s < searchFieldLen; s++){
         salad[r][s] = '.';
      }
   }
   
   // -> erst wenn die ganze Länge des Wortes frei ist, array hinzufügen
   // MAX Versuche das Wort zu platzieren == 10 
   

   // Wörter in salad einsortieren
   for (int num_words = 0; num_words < wordCount; num_words++){
      
      int laenge = strlen(words[num_words]);
      
      // muss noch prüfen, ob in der Zeile schon was ist
      // 1 ist horizontal, 0 ist vertikal
      // isalpha == 0 -> kein Buchstabe

      for(int versuch = 0; versuch < MAX_RAND_TRIES_PER_WORD; versuch++){
         int richtung = rand()% 2;
         int belegt = 0;

         // horizontale Eingabe
         if (richtung == 1){
            int zeile = rand()% searchFieldLen;
            int spalte = rand()% (searchFieldLen- laenge +1);
            
            //prüft, ob die herausgesuchte Zeile noch frei ist
            // belegt == 1 -> Zeile nicht frei
            for (int o = spalte; o < spalte + laenge; o++){
               if(salad[zeile][o] != '.'){
                  belegt = 1;
                  break;
               }
            }
            // setzt in das Array ein, wenn frei oder erhöht die Versuchsanzahl
            if (belegt == 0){
               for(int k = 0; k < laenge; k++){  
                  salad[zeile][spalte + k] = words[num_words][k];
                  
               }
               placedWords++;
               break;
            }      
         }
         // vertikale Eingabe
         else if (richtung == 0){

            int zeile = rand()% (searchFieldLen - laenge +1);
            int spalte = rand()% searchFieldLen;

            //prüft, ob die herausgesuchte Zeile noch frei ist
            for (int n = zeile; n < zeile + laenge; n++){
               if(salad[n][spalte] != '.'){
                  belegt = 1;
                  break;
               }
            }
            // setzt in das Array ein, wenn frei oder erhöht die Versuchsanzahl
            if (belegt == 0){
               for(int j = 0; j < laenge; j++){
                  salad[zeile + j][spalte] = words[num_words][j];
                  
               }
               placedWords++;
               break;
            }          
         }
         else{
            break;
         }
      }

   }

   // fügt zufällige Buchstaben ein
   for(int l = 0; l < searchFieldLen; l++){
      for(int m = 0; m < searchFieldLen; m++ ){
         if(isalpha(salad[l][m]) == 0 ){
            // zufällige Buchstaben erzeugen
            char alphabet [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            int laenge = strlen(alphabet);
            int zufallszahl = rand()% laenge;
            char zufallsbuchstabe = alphabet[zufallszahl];
            // zufällige Buchstaben einfügen
            salad[l][m] = zufallsbuchstabe; 
         }
      }
   } 
   
   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(int p = 0; p < searchFieldLen; p++){
      for(int q = 0; q < searchFieldLen; q++){
         printf("%c", salad[p][q]);
      }
      printf("\n");
   }
}