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

//große Funktion (Gitter bauen, Wörter legen, Zufallsbuchstaben)
int createWordSalad(char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN],                                             //Gitter
                    unsigned int size, const char words[][MAX_WORD_LEN],                                                //größe Quadrat,liste von Wörtern
                    unsigned int wordCount)  {                                                                          //anzahl an Wörtern in der Liste
    #define EMPTY_CHAR '.'                                                                                              // leeres kästchen = "."
    typedef enum { HORIZONTAL, VERTICAL } Direction;                                                                    //neuer typ: waagrecht oder senkrecht

    //1.kleine Funktion(setzt jedes Kästchen auf ".")
    void initializeArray() {
        for (unsigned int y = 0; y < size; y++)                                                                         //Zeilen durchlaufen
            for (unsigned int x = 0; x < size; x++)                                                                     //Spalten durchlaufen
                salad[y][x] = EMPTY_CHAR;                                                                               //punkt schreiben
    }
    //2.kleine Funktion (prüfen ob Wort passt)
    int canPlace(unsigned int x, unsigned int y, const char *word, Direction dir) {                                     //Startposition, das Wort, Richtung
        unsigned int len = strlen(word);                                                                                //länge des Wortes
        if ((dir == HORIZONTAL && x + len > size) || (dir == VERTICAL && y + len > size))                               //prüfen ob Wort über rechten bzw. unteren Rand geht
            return 0;                                                                                                   //passt das wort nicht -> 0
        for (unsigned int i = 0; i < len; i++) {                                                                        //jedes zeichen nacheinander prüfen
            if ((dir == HORIZONTAL && salad[y][x + i] != EMPTY_CHAR) ||                                                 //prüfen ob nach rechts schon ein wort kommt
                (dir == VERTICAL && salad[y + i][x] != EMPTY_CHAR))                                                     //prüfen ob nach unten ein Wort kommt
                return 0;                                                                                               //ist dort bereits ein wort -> 0
        }
        return 1;                                                                                                       //passt das Wort -> 1
    }
    //3.kleine Funktion (Wort ins Gitter schreiben)
    void placeWord(unsigned int x, unsigned int y, const char *word, Direction dir) {                                   //Startposition, das Wort, Richtung
        for (unsigned int i = 0; i < strlen(word); i++) {                                                               //Buchstabe für Buchstabe
            if (dir == HORIZONTAL)                                                                                      //i-ten Buchstaben an y,x+i schreiben bei waagrecht
                salad[y][x + i] = word[i];
            else                                                                                                        //i-ten Buchstaben an y+i,x schreiben bei senkrecht
                salad[y + i][x] = word[i];
        }
    }
    //4.kleine Funktion (alle leeren Kästchen bekommen Zufallsbuchstaben)
    void fillRandomLetters() {                                                                                          //geht wieder über alle Zeilen und Spalten oh man
        for (unsigned int y = 0; y < size; y++) {
            for (unsigned int x = 0; x < size; x++) {
                if (salad[y][x] == EMPTY_CHAR)                                                                          //wenns leer ist Zufallsbuchstabe
                    salad[y][x] = 'A' + (rand() % 26);
            }
        }
    }

    //Hauptschleife(Wörter zufällig platzieren)
    srand(time(NULL));                                                                                             //durch aktuelle Sekundenzeit wirkklich zufällig
    initializeArray();                                                                                                  //1.kleine Funktion

    int placed = 0;                                                                                                     //wie viele Wörter wurden gelegt?
    for (unsigned int i = 0; i < wordCount; i++) {                                                                      //jedes Wort durchgehen
        int success = 0;                                                                                                //für dieses Wort schon Platz gefunden?
        for (int tries = 0; tries < 1000 && !success; tries++) {                                                        //1000 verschiedene Stellen und Richtungen probieren
            unsigned int x = rand() % size;                                                                             //zufällige Position Spalte
            unsigned int y = rand() % size;                                                                             //zufällige Postion Zeile
            Direction dir = rand() % 2 ? HORIZONTAL : VERTICAL;                                                         //zufällige richtung 1-> Horizontal 0-> Vertical
            if (canPlace(x, y, words[i], dir)) {                                                                        //2. kleine Funktion
                placeWord(x, y, words[i], dir);                                                                         //3. kleine Funktion
                success = 1;                                                                                            //Wort erfolgreich platziert
                placed++;                                                                                               //Zähler der gelegten Wörter erhöhen
            }
        }
    }

    fillRandomLetters();                                                                                                //4. kleine Funktion

    return placed;                                                                                                      //Rückgabe wie viele Wörter plaziert wurden
}
//Anzeige-Funktion
void showWordSalad(const char salad[MAX_SEARCH_FIELD_LEN][MAX_SEARCH_FIELD_LEN], unsigned int size) {                   //funktion printet das wortsalatfeld
    for (unsigned int y = 0; y < size; y++) {
        for (unsigned int x = 0; x < size; x++) {
            printf("%c ", salad[y][x]);
        }
        printf("\n");
    }
}