var allSounds = Packages.net.canarymod.api.world.effects.SoundEffect.Type.values(),
  cmSoundEffect = Packages.net.canarymod.api.world.effects.SoundEffect,
  foreach = require('utils').foreach,
  i = 0,
  len = allSounds.length,
  sound, 
  soundName;

function playSound(sound, locationOrHasLocation, volume, pitch ) {
  var location = null;
  if (!locationOrHasLocation)
    return;
  if (locationOrHasLocation.world){
    location = locationOrHasLocation;
  } else {
    locationOrHasLocation = locationOrHasLocation.location;
    if (locationOrHasLocation && locationOrHasLocation.world ){
      location = locationOrHasLocation;
    }
  }
  if (!location){
    console.warn('sounds.play() needs a location');
    return;
  }
  if (typeof volume == 'undefined')
    volume = 1;
  if (typeof pitch == 'undefined')
    pitch = 1;
  var soundEffect = new cmSoundEffect(sound, location.x, location.y, location.z, volume, pitch);
  location.world.playSound(soundEffect);
}

for ( ; i < len; i++ ) {
  sound = allSounds[i];
  soundName = '' + sound.name();
  var methodName = soundName.toLowerCase().replace(/_(.)/g,function(a,b){ return b.toUpperCase();});
  exports[methodName] = (function(sound){ 
    return function()
    {
      switch (arguments.length) { 
	case 3:
	  playSound(sound, arguments[0], arguments[1], arguments[2]);
	  break;
	case 2:
	  // TODO: possible combinations: 
	  // location, volume, 
          // volume pitch
	  playSound(sound, arguments[0],arguments[1]);
	  break;
	case 1:
	  playSound(sound, arguments[0]);
	  break;
	case 0:
	  // play the sound at full vol, medium pitch for all players
	  //
	  foreach( server.playerList, function(player) {
	    playSound(sound, player, 1, 0);
	  });
	default:
	}
    };
  })(sound);
}

exports.play = playSound;
