/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   insertion.c                                        :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: adjoly <adjoly@student.42angouleme.fr>     +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2024/02/23 14:49:14 by adjoly            #+#    #+#             */
/*   Updated: 2024/03/11 16:03:14 by adjoly           ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "../push_swap.h"

void	prepare_to_send_a(t_stack **stack_b, size_t lowest_cost_b)
{
	size_t	i;

	if (lowest_cost_b < (ft_stacksize(*stack_b) / 2))
	{
		while (stack_b && *stack_b && lowest_cost_b > 0)
		{
			ft_rotatestack_b(stack_b);
			lowest_cost_b--;
		}
	}
	else
	{
		i = 0;
		while (stack_b && *stack_b && lowest_cost_b < ft_stacksize(*stack_b))
		{
			ft_reverserotate_b(stack_b);
			lowest_cost_b++;
		}
	}
}

size_t	get_index(t_stack **stack, int nb)
{
	t_stack	*tmp;
	size_t	i;

	i = 1;
	tmp = (*stack);
	while (tmp && tmp->next)
	{
		if (tmp->nb < nb && tmp->next->nb > nb)
			return (i);
		tmp = tmp->next;
		i++;
	}
	if (tmp && nb > tmp->nb && nb < (*stack)->nb)
		return (0);
	return (get_stack_min(stack));
}

size_t	get_lowest_cost(t_stack **stack_a, t_stack **stack_b)
{
	t_stack	*tmp;
	size_t	i_lowest_cost;
	size_t	lowest_cost_b;
	size_t	actual_cost_b;

	i_lowest_cost = get_index(stack_a, (*stack_b)->nb);
	tmp = *stack_b;
	actual_cost_b = 0;
	lowest_cost_b = 0;
	while (tmp)
	{
		if ((get_index(stack_a, tmp->nb) < i_lowest_cost))
		{
			i_lowest_cost = get_index(stack_a, tmp->nb);
			lowest_cost_b = actual_cost_b;
		}
		actual_cost_b++;
		tmp = tmp->next;
	}
	prepare_to_send_a(stack_b, lowest_cost_b);
	return (i_lowest_cost);
}

void	insert_nb(t_stack **stack_a, t_stack **stack_b)
{
	size_t	i;
	size_t	new_i_elem;
	size_t	stack_size;

	i = 0;
	new_i_elem = get_lowest_cost(stack_a, stack_b);
	stack_size = ft_stacksize(*stack_a);
	if (new_i_elem < (stack_size / 2))
	{
		while (i < new_i_elem)
		{
			ft_rotatestack_a(stack_a);
			i++;
		}
	}
	else
	{
		i = stack_size;
		while (i > new_i_elem)
		{
			ft_reverserotate_a(stack_a);
			i--;
		}
	}
	ft_push_a(stack_a, stack_b);
}

void	while_insert(t_stack **stack_a, t_stack **stack_b)
{
	while (*stack_b)
	{
		insert_nb(stack_a, stack_b);
	}
}