/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   map.c                                              :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: cchauvet <cchauvet@student.42angouleme.fr  +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2023/01/05 13:51:49 by cchauvet          #+#    #+#             */
/*   Updated: 2023/01/13 13:56:07 by cchauvet         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "solong.h"

char	**ft_readfile(char *path)
{
	char	**map;
	int		fd;
	size_t	nb_line;

	fd = open(path, O_RDONLY);
	nb_line = 1;
	map = ft_calloc(sizeof(char *), 2);
	if (map == NULL)
		return (NULL);
	map[0] = get_next_line(fd);
	while (map[nb_line - 1] != NULL)
	{
		ft_strchr(map[nb_line - 1], '\n')[0] = '\0';
		map[nb_line] = get_next_line(fd);
		map = ft_tabrealloc(map, nb_line + 1, nb_line + 2);
		if (map == NULL)
			return (NULL);
		nb_line++;
	}
	return (map);
}

void	ft_fill_pos(t_map *map)
{
	size_t	x;
	size_t	y;

	y = 1;
	while (map->patern[y + 1] != NULL)
	{
		x = 0;
		while (x < ft_strlen(map->patern[y]))
		{
			if (map->patern[y][x] == 'P')
			{
				map->player_pos[0] = x;
				map->player_pos[1] = y;
			}
			if (map->patern[y][x] == 'E')
			{
				map->exit_pos[0] = x;
				map->exit_pos[1] = y;
			}
			x++;
		}
		y++;
	}
}

t_map	*ft_getmap(char *path)
{
	t_map	*map;

	map = ft_calloc(sizeof(t_map), 1);
	if (map == NULL)
		return (NULL);
	map->patern = ft_readfile(path);
	if (ft_map_is_correct(map) == 0)
	{
		ft_freer_tab_ultimate(1, map->patern);
		free(map);
		return (NULL);
	}
	return (map);
}

static char	*ft_get_line(const char *line, ssize_t player_x)
{
	char	*out;
	ssize_t	start;
	ssize_t	stop;
	ssize_t	i;
	ssize_t	y;

	out = ft_strgen('0', RENDER_DISTANCE * 2 + 1);
	if (out == NULL)
		return (NULL);
	start = player_x - (RENDER_DISTANCE);
	if (start < 0)
		start = 0;
	stop = player_x + RENDER_DISTANCE + 1;
	if (stop > (ssize_t) ft_strlen(line))
		stop = ft_strlen(line);
	i = 0;
	y = player_x - RENDER_DISTANCE - start;
	if (y < 0)
		y = -y;
	while (start + i < stop)
	{
		out[y + i] = line[i + start];
		i++;
	}
	return (out);
}

char	**ft_get_player_map(t_map map)
{
	char	**player_map;
	ssize_t	y;
	ssize_t	i;

	player_map = ft_calloc(RENDER_DISTANCE * 2 + 2, sizeof(char *));
	if (player_map == NULL)
		return (NULL);
	i = map.player_pos[1] - RENDER_DISTANCE;
	if (i < 0)
		i = 0;
	y = -1;
	while (++y < RENDER_DISTANCE * 2 + 1)
	{
		if (map.player_pos[1] + y >= RENDER_DISTANCE && map.patern[i] != NULL)
			player_map[y] = ft_get_line(map.patern[i++], map.player_pos[0]);
		else
			player_map[y] = ft_strgen('0', RENDER_DISTANCE * 2 + 1);
		if (player_map[y] == NULL)
		{
			ft_cancel(player_map, y);
			return (NULL);
		}
	}
	player_map[y] = NULL;
	return (player_map);
}
