#include "./parse_private.h"

static int	ft_args_parse(char *cmd_str, t_cmd *cmd)
{
	char	**tab;
	size_t	i;

	tab = ft_split_quoted(cmd_str, ' ');
	if (tab == NULL)
		return (1);
	i = 0;
	while (tab[i] != NULL)
	{
		ft_quote_remover(tab[i]);
		i++;
	}
	cmd->args = tab;
	return (0);
}

static int	ft_executable_parse(t_data *data, t_cmd *cmd)
{
	bool	own;
	char	*path;

	path = cmd->args[0];
	own = 0;
	if (cmd->args[0] == NULL)
	{
		ft_closer(cmd->fd_in);
		ft_closer(cmd->fd_out);
	}
	else if (ft_strcmp(cmd->args[0], "env") == 0)
		own = 1;
	else if (ft_strcmp(cmd->args[0], "export") == 0)
		own = 1;
	else if (ft_strcmp(cmd->args[0], "echo") == 0)
		own = 1;
	else if (ft_strcmp(cmd->args[0], "unset") == 0)
		own = 1;
	else if (ft_strcmp(cmd->args[0], "exit") == 0)
		own = 1;
	else if (ft_strcmp(cmd->args[0], "pwd") == 0)
		own = 1;
	else if (ft_strcmp(cmd->args[0], "cd") == 0)
		own = 1;
	else
	{
		path = ft_get_executable(data, cmd->args[0]);
		if (path == NULL)
			return (1);
	}
	cmd->own_cmd = own;
	cmd->executable = path;
	return (0);
}

int	ft_cmd_parser(t_data *data, char *cmd_str)
{
	t_cmd	*cmd;
	t_list	*element;

	cmd = ft_calloc(sizeof(t_cmd), 1);
	if (cmd == NULL)
	{
		ft_eprintf("minishell: malloc failed\n");
		return (1);
	}
	if (ft_redirection(data, cmd, cmd_str))
	{
		ft_cmddel(cmd);
		return (0);
	}
	if (ft_args_parse(cmd_str, cmd))
	{
		ft_cmddel(cmd);
		return (1);
	}
	if (ft_executable_parse(data, cmd))
	{
		ft_cmddel(cmd);
		return (1);
	}
	element = ft_lstnew(cmd);
	if (element == NULL)
	{
		ft_cmddel(cmd);
		return (1);
	}
	ft_lstadd_back(data->cmds, element);
	return (0);
}

int	ft_cmds_parser(t_data *data, const char *line)
{
	char	**tab;
	size_t	i;

	tab = ft_split_quoted(line, '|');
	if (tab == NULL)
	{
		ft_freer_tab_ultimate(1, tab);
		ft_eprintf("minishell: malloc failed\n");
		return (1);
	}
	i = 0;
	while (tab[i] != NULL)
	{
		if (ft_cmd_parser(data, tab[i]))
		{
			ft_freer_tab_ultimate(1, tab);
			return (1);
		}
		i++;
	}
	if (*data->cmds != NULL)
	{
		ft_add_fd(((t_cmd *)(*data->cmds)->content)->fd_in, 0);
		ft_add_fd(((t_cmd *)(ft_lstlast(*data->cmds))->content)->fd_out, 1);
	}
	ft_freer_tab_ultimate(1, tab);
	return (0);
}
