from ..libloader.com import load_com
from .base import Output

import logging
log = logging.getLogger(__name__)

class Sapi4(Output):

 name = 'sapi4'
 priority = 102

 def __init__(self):
  sapi4 = load_com("{EEE78591-FE22-11D0-8BEF-0060081841DE}")
  self._voiceNo = sapi4.Find(0)
  sapi4.Select(self._voiceNo)
  sapi4.Speak(" ")
  self.__object = sapi4
  self._voice_list = self._available_voices()

 def _set_capabilities(self):
  sapi4 = self.__object
  try:
   sapi4.Pitch = sapi4.Pitch
   self._min_pitch = sapi4.MinPitch
   self._max_pitch = sapi4.MaxPitch
   self._has_pitch = True
  except:
   self._min_pitch = 0
   self._max_pitch = 0
   self._has_pitch = False
  try:
   sapi4.Speed = sapi4.Speed
   self._min_rate = sapi4.MinSpeed
   self._max_rate = sapi4.MaxSpeed
   self._has_rate = True
  except:
   self._min_rate = 0
   self._max_rate = 0
   self._has_rate = False
  try:
   sapi4.VolumeLeft = sapi4.VolumeLeft
   self._min_volume = sapi4.MinVolumeLeft
   self._max_volume = sapi4.MaxVolumeLeft
   self._has_volume = True
  except:
   self._min_volume = 0
   self._max_volume = 0
   self._has_volume = False

 def _available_voices(self):
  voice_list = []
  for voice_no in range(1, self.__object.CountEngines):
   voice_list.append(self.__object.ModeName(voice_no))
  return voice_list

 @property
 def available_voices(self):
  return self._voice_list

 def list_voices(self):
  return self.available_voices

 def get_voice(self):
  return self.__object.ModeName(self._voice_no)

 def set_voice(self, value):
  self._voice_no = self.list_voices().index(value) + 1
  self.__object.Select(self._voice_no)
  self.silence()
  self.__object.Speak(" ")
  self._set_capabilities()

 def get_pitch(self):
  if self.has_pitch:
   return self.__object.Pitch

 def set_pitch(self, value):
  if self.has_pitch:
   self.__object.Pitch = value

 def get_rate(self):
  if self.has_rate:
   return self.__object.Speed

 def set_rate(self, value):
  if self.has_rate:
   self.__object.Speed = value

 def get_volume(self):
  if self.has_volume:
   return self.__object.VolumeLeft

 def set_volume(self, value):
  if self.has_volume:
   self.__object.VolumeLeft = value

 @property
 def has_pitch(self):
  return self._has_pitch

 @property
 def has_rate(self):
  return self._has_rate

 @property
 def has_volume(self):
  return self._has_volume

 @property
 def min_pitch(self):
  return self._min_pitch

 @property
 def max_pitch(self):
  return self._max_pitch

 @property
 def min_rate(self):
  return self._min_rate

 @property
 def max_rate(self):
  return self._max_rate

 @property
 def min_volume(self):
  return self._min_volume

 @property
 def max_volume(self):
  return self._max_volume

 def speak(self, text, interrupt=False):
  if interrupt:
   self.silence()
  self.__object.Speak(text)

 def silence(self):
  self.__object.AudioReset()

output_class = Sapi4
