#include "philo.h"

t_philo	*lst_add_philo(t_philo *philo, t_params *params, t_mtx *m_print, int i)
{
	t_philo	*new;

	new = malloc(sizeof(t_philo) * 1);
	if (new == NULL)
		return (NULL);
	new->params = params;
	new->p_nbr = i + 1;
	if (pthread_mutex_init(&(new->m_fork), NULL) != 0)
		return (NULL);
	new->m_print = m_print;
	if (philo)
		philo->next = new;
	new->prev = philo;
	return (new);
}

// looping chained list
t_philo	*init_chain_philo(t_params *params, t_mtx *m_print)
{
	t_philo	*end;
	t_philo	*philo;
	int		i;

	i = 0;
	philo = NULL;
	while (i < params->n_phi)
	{
		philo = lst_add_philo(philo, params, m_print, i);
		i++;
	}
	end = philo;
	while (philo->prev != NULL)
		philo = philo->prev;
	philo->prev = end;
	end->next = philo;
	return (philo);
}

t_params	*init_params(int ac, char **av)
{
	t_params	*params;

	if (ac == 5 || ac == 6)
	{
		params = malloc(sizeof(t_params));
		params->n_phi = ft_atoi(av[1]);
		params->t_die = ft_atoi(av[2]);
		params->t_eat = ft_atoi(av[3]);
		params->t_slp = ft_atoi(av[4]);
		if (ac == 6)
			params->n_eat = ft_atoi(av[5]);
	}
	else
		return (NULL);
	return (params);
}

t_philo	*init(int ac, char **av, pthread_t **id)
{
	t_philo		*philo;
	t_params	*params;
	t_mtx		*m_print;

	params = init_params(ac, av);
	if (params == NULL)
		return (NULL);
	*id = malloc(sizeof(pthread_t) * params->n_phi);
	if (*id == NULL)
		return (NULL);
	m_print = malloc(sizeof(t_mtx));
	if (pthread_mutex_init(m_print, NULL) != 0)
		return (NULL);
	philo = init_chain_philo(params, m_print);
	if (philo == NULL)
		return (NULL);
	return (philo);
}
