#include <libgen.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "entrada_minishell.h"

/**
 * guardar_historial - Guarda el comando que se ha escrito en
 * historial_comandos.txt.
 *
 * @cad: Puntero a la cadena de caracteres que será guardada.
 * @ruta_binario: Ruta del binario de la minishell.
 * 
 * Esta función accede al archivo historial_comandos.txt que se encuentra en la
 * misma ubicación que el ejecutable de la minishell y guarda el comando que se
 * ha escrito.
 */
void guardar_historial(char *cad, char *ruta_binario) {

    // Obtenemos el directorio del binario
    char ruta_completa[1024];

    // Obtengo la ruta absoluta del binario
    realpath(ruta_binario, ruta_completa);

    // Obtenemos el directorio raíz del proyecto
    char *directorio_binario = dirname(dirname(ruta_completa));

    // Construimos la ruta al archivo de historial
    char ruta_historial[1064]; // Suficiente para directorio + nombre de archivo
    snprintf(ruta_historial, sizeof(ruta_historial), "%s/historial.txt", directorio_binario);

    // Abrimos el archivo en modo append
    FILE *historial_file = fopen(ruta_historial, "a");

    if (historial_file != NULL) {
        fprintf(historial_file, "%s\n",
                cad);           // Guardamos la línea en el archivo
        fclose(historial_file); // Cerramos el archivo
    } else {
        perror("Error al guardar el historial");
    }
}

/**
 * imprimir_prompt - Muestra el prompt de la minishell en la consola.
 *
 * Esta función imprime el texto "minishell> " en la salida estándar, indicando
 * que el usuario puede ingresar órdenes.
 */
void imprimir_prompt() {
    printf("minishell> "); // mostrar en pantalla la cadena que servirá de
                           // prompt: entrada de órdenes en la consola
    fflush(stdout); // vacía el buffer intermedio de salida y se envía el texto
                    // a la pantalla
}

/**
 * eliminar_salto_linea - Elimina el carácter de salto de línea ('\n') de una
 * cadena.
 *
 * @cad: Puntero a la cadena de caracteres que será modificada.
 *
 * Esta función busca y elimina el carácter de salto de línea al final de la
 * cadena, si está presente.
 */
void eliminar_salto_linea(char *cad) {
    int i, longitud;
    // cad es una cadena de caracteres con la orden leída.
    longitud = strlen(cad);
    // se busca el carácter de final de línea introducido por fgets y se
    // sustituye por '\0' para indicar el final de orden
    for (i = longitud - 1; i >= 0; i--)
        if (cad[i] == '\n') {
            cad[i] = 0;
            break;
        }
}

/**
 * leer_linea_ordenes - Lee una línea de órdenes ingresada por el usuario.
 *
 * @buf: Puntero al buffer donde se almacenará la línea leída.
 *
 * Esta función utiliza `fgets` para leer la línea ingresada por el usuario,
 * eliminando el salto de línea al final de la entrada.
 */
void leer_linea_ordenes(char *buf) {

    memset(buf, 0, sizeof(BUFSIZ));
    // fgets almacena la orden leída introduciendo también el carácter de fin de
    // línea
    if (fgets(buf, BUFSIZ - 1, stdin) == NULL) {
        buf[0] = '\0';
        return;
    }

    eliminar_salto_linea(buf);
}
