#!/usr/bin/env bash
# convert_text_case
# -----------------
# Convierte el contenido de texto de un archivo aplicando transformaciones:
# upper (mayúsculas), lower (minúsculas), lf (normalizar saltos a LF),
# crlf (normalizar saltos a CRLF).
#
# USO:
#   source convert_text_case.sh
#   convert_text_case mode file [output_file]
#
# ARGUMENTOS:
#   mode         Transformación a aplicar: upper|lower|lf|crlf (requerido)
#   file         Archivo de entrada (requerido)
#   output_file  Archivo de salida (opcional; por defecto imprime a stdout)

convert_text_case() {
    local mode="${1:-}"
    local input_file="${2:-}"
    local output_file="${3:-}"

    # Validar argumentos requeridos
    if [[ -z "$mode" ]]; then
        echo "convert_text_case: modo requerido (upper|lower|lf|crlf)" >&2
        return 1
    fi

    if [[ -z "$input_file" ]]; then
        echo "convert_text_case: archivo de entrada requerido" >&2
        return 1
    fi

    if [[ ! -f "$input_file" ]]; then
        echo "convert_text_case: archivo no encontrado: ${input_file}" >&2
        return 1
    fi

    # Función auxiliar que aplica la conversión y escribe a stdout o archivo
    _apply_conversion() {
        local src="$1"
        local op="$2"
        case "$op" in
            upper)
                awk '{ print toupper($0) }' "$src"
                ;;
            lower)
                awk '{ print tolower($0) }' "$src"
                ;;
            lf)
                sed 's/\r$//' "$src"
                ;;
            crlf)
                sed 's/\r$//' "$src" | sed 's/$/\r/'
                ;;
            *)
                echo "convert_text_case: modo no soportado: ${op}. Usa: upper|lower|lf|crlf" >&2
                return 1
                ;;
        esac
    }

    if [[ -n "$output_file" ]]; then
        _apply_conversion "$input_file" "$mode" > "$output_file"
        echo "convert_text_case: ${input_file} → ${output_file} (modo: ${mode})"
    else
        _apply_conversion "$input_file" "$mode"
    fi
}

# Ejecutar si se invoca directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    convert_text_case "$@"
fi
