#include "../header.h"


// Imposer une limite car de temps en temps, ça va à l'infini si y'a plus d'endroit libre
t_point select_case_vide(char **tab, int size, int anti_overflow)
{
    t_point point;
    
    if (anti_overflow <= 0)
    {
        point.col = -1;
        point.line = -1;
        return (point);
    }
    point.col = rand() % (2 * size);
    point.line = rand() % size;
    if (point.col % 2 == 0)
        point.col++;;
    if (point.line % 2 == 0)
        point.line++;
    
    if (tab[point.line][point.col] != SP)
        return (select_case_vide(tab, size, anti_overflow - 1));
    
    return (point);
}


int     creation_aleatoire(char **tab, int nb_iteration, int size)
{
    t_point point;
    int     *liaison_possible;
    int     dir;
    point = select_case_vide(tab, size, 100);
    {
        if ((point.col == -1) || point.line == -1)
            return (0);
    }
    liaison_possible = verif_possibilite_deplacement(tab, point, size, CUL_DE_SAC);
    if (liaison_possible == NULL)
        return (creation_aleatoire(tab, nb_iteration, size));
    dir = generer_direction_rand(liaison_possible);
    tab[point.line][point.col] = CUL_DE_SAC;
    if (dir == 0)
    {
        tab[point.line - 1][point.col] = CUL_DE_SAC;
        tab[point.line - 2][point.col] = CUL_DE_SAC;
    }
    else if (dir == 1)
    {
        tab[point.line][point.col + 1] = CUL_DE_SAC;
        tab[point.line][point.col + 2] = CUL_DE_SAC;
    }
    else if (dir == 2)
    {
        tab[point.line + 1][point.col] = CUL_DE_SAC;
        tab[point.line + 2][point.col] = CUL_DE_SAC;
    }
    else if (dir == 3)
    {
        tab[point.line][point.col - 1] = CUL_DE_SAC;
        tab[point.line][point.col - 2] = CUL_DE_SAC;
    }
    free(liaison_possible);
    
    if (nb_iteration == 0)
        return (0);
    return(creation_aleatoire(tab, nb_iteration - 1, size));
}
int     min_0(int i)
{
    if (i < 0)
        return(0);
    return (i);
}

int     relier_CHEMIN_PRIS_et_CUL_DE_SAC(char **tab, int i, int j)
{
    if (tab[i][j + 1] == CUL_DE_SAC)
    {
        tab[i][j + 1] = CHEMIN_PRIS;
        return (relier_CHEMIN_PRIS_et_CUL_DE_SAC(tab, i, j + 1));
    }
    else if (tab[i][j - 1] == CUL_DE_SAC)
    {
        tab[i][j - 1] = CHEMIN_PRIS;
        return (relier_CHEMIN_PRIS_et_CUL_DE_SAC(tab, i, j - 1));
    }
    else if (tab[i + 1][j] == CUL_DE_SAC)
    {
        tab[i + 1][j] = CHEMIN_PRIS;
        return (relier_CHEMIN_PRIS_et_CUL_DE_SAC(tab, i + 1, j));
    }
    else if (tab[i - 1][j] == CUL_DE_SAC)
    {
        tab[i - 1][j] = CHEMIN_PRIS;
        return (relier_CHEMIN_PRIS_et_CUL_DE_SAC(tab, i - 1, j));
    }
    return (0);
}

void    finish_culs_sacs(char **tab, int i, int j)
{
    if ((tab[i][j] == CUL_DE_SAC) || (tab[i][j] == SP))
    {
        tab[i][j] = CHEMIN_PRIS;
        if (tab[i][j + 2] == CHEMIN_PRIS)
            tab[i][j + 1] = CHEMIN_PRIS;
        else if (tab[i + 2][j] == CHEMIN_PRIS)
            tab[i + 1][j] = CHEMIN_PRIS;
        else if (tab[min_0(i - 2)][j] == CHEMIN_PRIS)
            tab[i - 1][j] = CHEMIN_PRIS;
        else if (tab[i][min_0(j - 2)] == CHEMIN_PRIS)
            tab[i][j - 1] = CHEMIN_PRIS;
        relier_CHEMIN_PRIS_et_CUL_DE_SAC(tab, i, j);
    }
    if (((tab[i][j + 1] == MUR_EXT) || (tab[i][j + 1] == SORTIE)) && (tab[i + 1][j] != MUR_EXT))
        finish_culs_sacs(tab, i + 1, 1);
    else if (tab[i + 1][j] != MUR_EXT)
        finish_culs_sacs(tab, i, j + 1);
        
}

void     generation_culs_sac(char **tab, int size)
{
    creation_aleatoire(tab, size * size / 6.5, size);
    finish_culs_sacs(tab, 1, 3);
}