/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   m_argv.c                                           :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: rbousset <marvin@42.fr>                    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/02/14 17:19:27 by rbousset          #+#    #+#             */
/*   Updated: 2020/02/14 17:19:29 by rbousset         ###   ########lyon.fr   */
/*                                                                            */
/* ************************************************************************** */

#include <sys/stat.h>
#include <libft.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>

#include "f_fail.h"
#include "d_define.h"
#include "m_comm.h"
#include "m_init.h"
#include "m_loop.h"
#include "m_mshrc.h"
#include "s_struct.h"
#include "u_vars.h"

static char	*m_get_prev_hist(t_msh *msh)
{
	struct stat	sb;
	char		*hist;
	char		histfile[PATH_MAX];
	int32_t		fd;

	hist = NULL;
	u_get_var_value(histfile, "$HISTFILE", PATH_MAX, msh);
	if (histfile[0] == C_NUL)
		return (NULL);
	if ((fd = open(histfile, O_RDONLY)) == -1)
		return (NULL);
	if (stat(histfile, &sb) == -1)
		return (NULL);
	if ((hist = (char*)malloc((sb.st_size + 1) * sizeof(char))) == NULL)
		return (NULL);
	if (read(fd, hist, sb.st_size) == -1)
		return (NULL);
	hist[sb.st_size] = C_NUL;
	return (hist);
}

static void	m_read_script(char *const argv[], t_msh *msh)
{
	int32_t	fd;

	if ((fd = open(*(argv + 1), O_RDONLY)) == -1)
		f_open_file(*(argv + 1), msh);
	msh->fd = fd;
	msh->argv = (char**)(argv + 1);
	msh->argc -= 1;
	msh->ret = m_loop(fd, msh);
	close(fd);
}

uint8_t		m_argv(int argc, char *const argv[], t_msh *msh)
{
	if (argc == 1)
	{
		m_init_custom_vars(msh);
		msh->prev_hist = m_get_prev_hist(msh);
		msh->ret = m_source_mshrc(msh);
		msh->fd = STDIN_FILENO;
		msh->ret = m_loop(STDIN_FILENO, msh);
	}
	else if (argc > 1 && ft_strncmp(*(argv + 1), FT_OPT_COMMAND, 3) == 0)
	{
		if (*(argv + 2) == NULL)
		{
			ft_dprintf(STDERR_FILENO, "%s: %s: option requires an argument\n",
				msh->argv[0], FT_OPT_COMMAND);
			return (2);
		}
		msh->ret = m_comm(*(argv + 2), msh);
	}
	else
	{
		m_read_script(argv, msh);
	}
	return (msh->ret);
}