/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   export.c                                           :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: sede-san <sede-san@student.42madrid.com    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2026/02/09 22:05:00 by codex             #+#    #+#             */
/*   Updated: 2026/02/09 22:05:00 by codex            ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "builtins.h"

static uint8_t	is_valid_identifier(const char *arg, size_t name_len);
static uint8_t	export_one(char *arg, t_minishell *msh);

uint8_t	builtin_export(
	t_command cmd,
	t_minishell *msh
)
{
	uint8_t	status;
	size_t	i;

	if (cmd.argc == 1)
		return (builtin_env(cmd, msh));
	status = EXIT_SUCCESS;
	i = 0;
	while (cmd.argv[++i] != NULL)
		if (export_one(cmd.argv[i], msh) != EXIT_SUCCESS)
			status = EXIT_FAILURE;
	return (status);
}

static uint8_t	is_valid_identifier(
	const char *arg,
	size_t name_len
)
{
	size_t	i;

	if (name_len == 0 || arg == NULL)
		return (0);
	if (!ft_isalpha(arg[0]) && arg[0] != '_')
		return (0);
	i = 0;
	while (++i < name_len)
		if (!ft_isalnum(arg[i]) && arg[i] != '_')
			return (0);
	return (1);
}

static uint8_t	export_one(
	char *arg,
	t_minishell *msh
)
{
	char	*eq_pos;
	char	*name;
	size_t	name_len;

	eq_pos = ft_strchr(arg, '=');
	name_len = ft_strlen(arg);
	if (eq_pos != NULL)
		name_len = (size_t)(eq_pos - arg);
	if (!is_valid_identifier(arg, name_len))
		return (ft_eprintf("minishell: export: `%s': not a valid identifier\n",
				arg), EXIT_FAILURE);
	name = ft_substr(arg, 0, name_len);
	if (name == NULL)
		return (EXIT_FAILURE);
	if (eq_pos != NULL)
		set_env(name, eq_pos + 1, msh);
	else
		set_env(name, "", msh);
	free(name);
	return (EXIT_SUCCESS);
}
