#!/bin/bash
SOURCE="$0"
source /usr/lib/elive-tools/functions
EL_REPORTS="1"
#el_make_environment

if [[ ! -t 0 ]] ; then
    is_stdin=1
    text="$( cat 2>&1 | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" )"
fi

#-------------------------------------------------------------------------------
#   Speak something
#-------------------------------------------------------------------------------
main(){
    # pre {{{
    local process hour is_force

    if [[ "$1" = -f ]] || [[ "$1" = --force ]] ; then
        is_force=1
        shift
    fi



    if [[ -z "$1" ]] && ! ((is_stdin)) ; then
        return 0
    fi

    if [[ -z "$text" ]] ; then
        text="$@"
    fi

    if [[ "$( echo "$text" | wc -w )" -gt 30 ]] ; then
        el_notify soft stock_volume "Elive Speaking: Text too long" "This text is too long to be spoken, ignoring it..."
        exit
    fi

    #text_filename="${text//\//%}"
    text_filename="$( echo "$text" | sha1sum | awk '{print $1}' )"
    el_debug "Text to speak: $text"

    if ((NOVOICE)) || ((SILENT)) ; then
        #el_explain 2 "ignoring reproduction of voice because of an environment variable"
        exit
    fi

    # check if we are at night | actually disabled: we need a better way to configure this (from desktop)
    hour="$(date +%k)"

    if [[ "${hour}" -ge "21" ]] || [[ "$hour" -lt "8" ]] ; then
        if ! ((is_force)) ; then
            el_explain 2 "ignoring reproduction of voice because we may be sleeping at this hour"
            exit
        fi
    fi

    # }}}

    # this trick is required because an ugly tmp.lab file is created in the home
    mkdir -p "/tmp/.$(basename $0)-$USER-$$"  "$HOME/.cache/el_speak"
    cd "/tmp/.$(basename $0)-$USER-$$"

    # wait for someone that finishes to speak before to start speaking
    #if ps aux | grep -v grep | grep -v "$$" | grep -vE "(vi|vim|gvim|emacs|scite|geany)" | grep -q "$(basename $0) " ; then
    #echo -e "Waiting for someone that finishes to speak before to start speaking" 1>&2
    #sleep 1
    #fi

    # default
    #echo "${text}" | iconv -f utf8 -t ISO-8859-15 | text2wave -f 48000 -otype riff -scale 0.8 | play -q -t wav - tempo 1.0 pad 0 3 phaser 0.9 0.85 4 0.23 1.3 -s reverb 45 50 100 100 69 3 norm
    # futuristic
    #echo "${text}" | iconv -f utf8 -t ISO-8859-15 | text2wave -f 48000 -otype riff -scale 0.8 | play -q -t wav - tempo 1.0 pad 0 3 flanger reverb 60 50 100 100 69 3 norm
    # futuristic + less echo + more chorus in background
    #echo "${text}" | iconv -f utf8 -t ISO-8859-15 | text2wave -f 48000 -otype riff -scale 0.8 | play -q -t wav - tempo 1.0 pad 0 3 flanger reverb 40 50 100 100 75 3 norm 2  2>/dev/null

    #echo "${text}" | iconv -f utf8 -t ISO-8859-15 | text2wave -f 48000 -otype riff -scale 0.8 | play -q -t wav - tempo 1.0 pad 0 2 flanger reverb 40 50 100 100 75 3 norm 4  2>/dev/null

    # play if we have it in cache, with effects
    if [[ -s "$HOME/.cache/el_speak/${text_filename}.wav" ]] ; then
        el_debug "playing .wav cached file: $text_filename"
        play -q -t wav "$HOME/.cache/el_speak/${text_filename}.wav" tempo 1.0 pad 0 2 flanger reverb 40 50 100 100 75 3 norm 5  2>/dev/null
        is_played=1
    else
        if [[ -s "$HOME/.cache/el_speak/${text_filename}.mp3" ]] ; then
            el_debug "playing .mp3 cached file: $text_filename"
            # play -q -t mp3 "$HOME/.cache/el_speak/${text_filename}.mp3" tempo 1.0 pad 0 2 flanger reverb 40 50 100 100 75 3 norm 5  2>/dev/null
            lame --quiet --decode "$HOME/.cache/el_speak/${text_filename}.mp3" - | play -q -t wav - tempo 1.0 pad 0 2 flanger reverb 40 50 100 100 75 3 norm 5  2>/dev/null
            is_played=1
        fi
    fi

    # save a copy of the voice
    if ! ((is_played)) ; then
        # create new audio file
        if [[ -n "$OPENAI_API_KEY" ]] && [[ -x "$( which elive-assistant )" ]] && el_verify_internet fast ; then
            file="$( echo "${text}" | voice=nova DISPLAY="" elive-assistant --stdout speech )"
            # rate limit?
            #if [[ ! -s "$file" ]] ; then
                #sleep 2 ; file="$( echo "${text}" | voice=nova elive-assistant --stdout speech )"
                #if [[ ! -s "$file" ]] ; then
                    #sleep 10 ; file="$( echo "${text}" | voice=nova elive-assistant --stdout speech )"
                    #if [[ ! -s "$file" ]] ; then
                        #sleep 30 ; file="$( echo "${text}" | voice=nova elive-assistant --stdout speech )"
                        #if [[ ! -s "$file" ]] ; then
                            #sleep 1m ; file="$( echo "${text}" | voice=nova elive-assistant --stdout speech )"
                        #fi
                    #fi
                #fi
            #fi

            if [[ -s "$file" ]] ; then
                mv -f "$file" "$HOME/.cache/el_speak/${text_filename}.mp3"
                lame --quiet --decode "$HOME/.cache/el_speak/${text_filename}.mp3" - | play -q -t wav - tempo 1.0 pad 0 2 flanger reverb 40 50 100 100 75 3 norm 5  2>/dev/null
                is_played=1
            fi
        fi

        if ! ((is_played)) ; then
            echo "${text}" | iconv -f utf8 -t ISO-8859-15 | text2wave -f 48000 -otype riff -scale 0.8 > "$HOME/.cache/el_speak/${text_filename}.wav"

            # play it
            play -q -t wav "$HOME/.cache/el_speak/${text_filename}.wav" tempo 1.0 pad 0 2 flanger reverb 40 50 100 100 75 3 norm 5  2>/dev/null
            is_played=1

            # save bigger cache and compressed
            lame --quiet -q 7 "$HOME/.cache/el_speak/${text_filename}.wav" "$HOME/.cache/el_speak/${text_filename}.mp3"
        fi

        cd "$HOME/.cache/el_speak"
        ls -1tr *mp3 | head -n "-1000" | xargs rm -f
        rm -f "$HOME/.cache/el_speak/"*.wav
    fi


    #echo "$text" >> /tmp/.$(basename $0)-${USER}-log.txt

    cd - 1>/dev/null
    rm -rf /tmp/.$(basename $0)-$USER-$$
}

#
#  MAIN
#
el_dependencies_check "text2wave|play|sox|iconv|lame"

if ((is_stdin)) ; then
    main "$@"
else
    { main "$@" & disown ; } 2>/dev/null
fi

# vim: set foldmethod=marker :

