DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`expedition_setDimensions`(
	vExpeditionFk INT,
	vWeight DECIMAL(10,2),
	vLength INT,
	vWidth INT,
	vHeight INT,
	OUT vExpeditionOutFk INT)
BEGIN
/**
 * Actualiza las dimensiones, peso y estado de una expedición
 *
 * @param vExpeditionFk Identificador de expedition
 * @param vWeight Peso en kilos
 * @param vLength Byte con el número de fotocélulas activadas a lo largo
 * @param vWidth Byte con el número de fotocélulas activadas a lo ancho
 * @param vHeight Altura de la caja en cm
 * @return vExpeditionOutFk Identificador de expedition
 */
	
	DECLARE vWidthSensorsUsed INT;
	DECLARE vLengthSensorsUsed INT;

	SET vExpeditionOutFk = expedition_check(vExpeditionFk);

	#primer bit a 1 a la izquierda - primer bit a 1 a la derecha
	SET vWidthSensorsUsed = length(BIN(vWidth)) - LOG2(vWidth & -vWidth);
	SET vLengthSensorsUsed = length(BIN(vLength)) - LOG2(vLength & -vLength);

	UPDATE expedition e
			JOIN expeditionState es ON es.`description` = 'WEIGHED'
			JOIN config c
		SET weight = IFNULL(vWeight, 0),
			stateFk = es.id,
			width = IFNULL(c.widthToFirstSensor + (c.widthSensorSpacing * vWidthSensorsUsed), 0), 
			`length` = IFNULL(c.lengthToFirstSensor + (c.lengthSensorSpacing * vLengthSensorsUsed), 0), 
			height = IFNULL(vHeight * 10, 0)
		WHERE e.id = vExpeditionOutFk;

	SET vExpeditionOutFk = vExpeditionFk;

END$$
DELIMITER ;