#!/bin/js

window.speak = async function(str, opts){            

  if( !str) return
  let defaultOpts
  let term = document.querySelector("[isoterminal]").components.isoterminal.term

  try{
    let buf = await term.worker.read_file("root/.config/webspeech/settings.json")
    let jsonstr = new TextDecoder().decode(buf);
    defaultOpts = JSON.parse(jsonstr)
  }catch(e){
    defaultOpts = {
      speaksigns:true,
      override:true,
      speak_rate: 1,               
      speak_pitch: 0.01,              
      speak_volume: 1,             
      speak_voice: -1,             
      speak_voices: 0
    }
  }
  opts = { ...defaultOpts, ...opts, speak: {} }

  if( opts.speaksigns ){     
    str = str.replace(/\/\//,' ')   
             .replace(/:/,'')
             .replace(/\//,' slash ')        
             .replace(/\./,' dot ')          
             .replace(/#/,' hash ')          
             .replace(/&/,' and ')           
             .replace(/=/,' is ')            
  }         
  if( str == opts.speak.lastStr ) return // no duplicates
  opts.speak.lastStr = str
  let speech = window.speechSynthesis 
  let utterance = new SpeechSynthesisUtterance( str ) 
  opts.speak_voices = speech.getVoices().length
  if( opts.speak_voice != -1 && opts.speak_voice < opts.speak_voices ){
    utterance.voice  = speech.getVoices()[ opts.speak_voice ];
  }else{
    let voices = speech.getVoices() 
    for(let i = 0; i < voices.length; i++ ){
      if( voices[i].lang == navigator.lang ) opts.speak_voice = i;
    } 
  }     
  utterance.rate   = opts.speak_rate
  utterance.pitch  = opts.speak_pitch
  utterance.volume = opts.speak_volume
  if( opts.override ) speech.cancel() 
  speech.speak(utterance)    
}

window.speak( args.slice(1).join(' ') )

return ""