'use strict';
/*global require, echo,__plugin, module*/
var blocks = require('blocks');
/************************************************************************
### Drone.wallsign() method

Creates a wall sign (A sign attached to a wall)

#### Parameters

 * message - can be a string or an array of strings

#### Example

    drone.wallsign(['Welcome','to','Scriptopia']);

![wall sign](img/signex2.png)

### Drone.signpost() method

Creates a free-standing signpost 

#### Parameters

 * message - can be a string or an array of strings

#### Example

    drone.signpost(['Hello','World']);

![ground sign](img/signex1.png)

### Drone.sign() method

Deprecated: Use signpost() or wallsign() methods instead.

Signs must use block 63 (stand-alone signs) or 68 (signs on walls)

#### Parameters

 * message -  can be a string or an array of strings. 
 * block - can be 63 or 68

#### Example

To create a free-standing sign...

    drone.sign(["Hello","World"], blocks.sign_post);

![ground sign](img/signex1.png)

... to create a wall mounted sign...

    drone.sign(["Welcome","to","Scriptopia"], blocks.sign );

![wall sign](img/signex2.png)

***/
function putSign( drone, texts, blockId, meta ) {
  var i,
    len = texts.length,
    block,
    state,
    getState, 
    isSign, 
    setLine;

  if ( blockId != blocks.sign_post && blockId != blocks.sign ) {
    throw new Error( 'Invalid Parameter: blockId must be blocks.sign_post or blocks.sign' );
  }
  block = drone.setBlock( blockId, meta);
  if (__plugin.canary){
    isSign = function(block){ 
      var sign = block.getTileEntity();
      return sign.setTextOnLine; 
    };
    setLine = function( block, i) { 
      var sign = block.getTileEntity();
      sign.setTextOnLine( texts[i], i ); 
      sign.update(); 
    };
  }
  if (__plugin.bukkit){
    isSign = function(block){ return block.state && block.state.setLine; };
    setLine = function( block, i) { 
      var sign = block.state;
      sign.setLine( i, texts[i] ); 
      sign.update(true); 
    };
  }
  if ( isSign(block) ) { 
    if (len > 4){
      len = 4;
    }
    for ( i = 0; i < len; i++ ) {
      setLine(block, i, texts[ i ] );
    }
  }
};
function signpost( message ){
  this.then(function(){
    this.sign(message, blocks.sign_post);
  });
}
function wallsign( message ){
  /*
   must allow for /js wallsign() while looking at a wall block
   */
  this.then(function(){
    var block = this.getBlock();
    if (block.typeId == blocks.air || block.typeId == blocks.sign){
      this.sign(message, blocks.sign);
    } else {
      this
	.back()
	.sign(message, blocks.sign)
	.fwd();
    }
});
  
}
function sign( message, block ) {
  if ( message.constructor != Array ) {
    message = [message];
  }
  var bm = this.getBlockIdAndMeta( block );
  block = bm[0];
  var meta = bm[1];
  if ( block !== blocks.sign_post && block !== blocks.sign ) {
    var usage = 'Usage: sign("message", blocks.sign_post) or sign("message", blocks.sign)';
    if ( this.player ) {
      echo( this.player, usage);
    }
    console.error(usage);
    return;
  }
  putSign( this, message, block,  meta);

}
module.exports = function(Drone){
  Drone.extend(sign);
  Drone.extend(signpost);
  Drone.extend(wallsign);
};
