import collections
import ctypes
from sound_lib.external import pybass
from sound_lib.main import bass_call, bass_call_0

class BassConfig(collections.Mapping):
 config_map = {
  '3d_algorithm': pybass.BASS_CONFIG_3DALGORITHM,
  'buffer': pybass.BASS_CONFIG_BUFFER ,
  'curve_vol': pybass.BASS_CONFIG_CURVE_VOL,
  'curve_pan': pybass.BASS_CONFIG_CURVE_PAN,
  'dev_buffer': pybass.BASS_CONFIG_DEV_BUFFER,
  'dev_default': pybass.BASS_CONFIG_DEV_DEFAULT,
  'float_dsp': pybass.BASS_CONFIG_FLOATDSP,
  'gvol_music': pybass.BASS_CONFIG_GVOL_MUSIC,
  'gvol_sample': pybass.BASS_CONFIG_GVOL_SAMPLE,
  'gvol_stream': pybass.BASS_CONFIG_GVOL_STREAM,
  'music_virtual': pybass.BASS_CONFIG_MUSIC_VIRTUAL,
  'net_agent': pybass.BASS_CONFIG_NET_AGENT,
  'net_buffer': pybass.BASS_CONFIG_NET_BUFFER,
  'net_passive': pybass.BASS_CONFIG_NET_PASSIVE,
  'net_playlist': pybass.BASS_CONFIG_NET_PLAYLIST,
  'net_prebuf': pybass.BASS_CONFIG_NET_PREBUF,
  'net_proxy': pybass.BASS_CONFIG_NET_PROXY,
  'net_read_timeout': pybass.BASS_CONFIG_NET_READTIMEOUT,
  'net_timeout': pybass.BASS_CONFIG_NET_TIMEOUT,
  'pause_no_play': pybass.BASS_CONFIG_PAUSE_NOPLAY,
  'rec_buffer': pybass.BASS_CONFIG_REC_BUFFER,
  'src': pybass.BASS_CONFIG_SRC,
  'src_sample': pybass.BASS_CONFIG_SRC_SAMPLE,
  'unicode': pybass.BASS_CONFIG_UNICODE,
  'update_period': pybass.BASS_CONFIG_UPDATEPERIOD,
  'update_threads': pybass.BASS_CONFIG_UPDATETHREADS,
  'verify': pybass.BASS_CONFIG_VERIFY,
  'vista_speakers': pybass.BASS_CONFIG_VISTA_SPEAKERS,
 }

 ptr_config = (pybass.BASS_CONFIG_NET_AGENT, pybass.BASS_CONFIG_NET_PROXY)

 def __getitem__(self, key):
  key = self.config_map.get(key, key)
  if key in self.ptr_config:
   return ctypes.string_at(bass_call(pybass.BASS_GetConfigPtr, key))
  return bass_call_0(pybass.BASS_GetConfig, key)

 def __setitem__(self, key, val):
  key = self.config_map.get(key, key)
  if key in self.ptr_config:
   return bass_call(pybass.BASS_SetConfigPtr, key, ctypes.create_string_buffer(val))
  return bass_call(pybass.BASS_SetConfig, key, val)

 def __iter__(self):
  for key in self.config_map.keys():
   yield key

 def __len__(self):
  return len(self.config_map)
