/**
 *  Title:  class Robot
 *  Description: Simple representation of a robot.
 *  Copyright (c) 2001
 *  Organisation: UCL
 *  @author Graham Roberts 
 *  @version 1.1 10/03
 */

import java.awt.* ;

class Robot
{
  private int xpos ;
  private int ypos ;
  private int direction ;
  private Room room ;
  private int speed ;
  private boolean hasWidget ;
  
  public Robot(int x, int y, int d, Room r)
  {
    xpos = x ;
    ypos = y ;
    direction = d ;
    hasWidget = false ;
    room = r ;
    room.setRobotPosition(xpos,ypos,direction) ;
    speed = 1000 ;
  }
  
  public void forward()
  {
    pause() ;
    if (!canMoveForward())
    {
      room.beep() ;
      return ;
    }
    switch (direction)
    {
      case Room.NORTH :
        ypos-- ;
        break ;
        
      case Room.EAST :
        xpos++ ;
        break ;
        
      case Room.SOUTH :
        ypos++ ;
        break ;
          
      case Room.WEST :
        xpos-- ;
        break ;
    }
    room.setRobotPosition(xpos,ypos,direction) ;
  }
  
  public void left()
  {
    pause() ;
    switch (direction)
    {
      case Room.NORTH :
          direction = Room.WEST ;
        break ;
      case Room.EAST :
          direction = Room.NORTH ;
        break ;
      case Room.SOUTH :
          direction = Room.EAST ;
        break ;
      case Room.WEST :
          direction = Room.SOUTH ;
        break ;
    }   
    room.setRobotPosition(xpos,ypos,direction) ;
  }
  
  public void right()
  {
    pause() ;
    switch (direction)
    {
      case Room.NORTH :
          direction = Room.EAST ;
        break ;
      case Room.EAST :
          direction = Room.SOUTH ;
        break ;
      case Room.SOUTH :
          direction = Room.WEST ;
        break ;
      case Room.WEST :
          direction = Room.NORTH ;
        break ;
    }   
    room.setRobotPosition(xpos,ypos,direction) ;
  }
  
  public boolean canMoveForward()
  {
    switch (direction)
    {
      case Room.NORTH :
        if ((ypos > 0) && !room.isObstacleAt(xpos,ypos-1))
        {
          return true ;
        }
        break ;
        
      case Room.EAST :
        if ((xpos < room.getRoomSizeX()-1) && !room.isObstacleAt(xpos+1,ypos))
        {
          return true ;
        }
        break ;
        
      case Room.SOUTH :
        if ((ypos < room.getRoomSizeY()-1) && !room.isObstacleAt(xpos,ypos+1))
        {
          return true ;
        }
        break ;
          
      case Room.WEST :
        if ((xpos > 0) && !room.isObstacleAt(xpos-1,ypos))
        {
          return true ;
        }
        break ;
     }
     return false ;
  }
  
  public boolean atDoor()
  {
    int wall = room.getDoorWall() ;
    int position = room.getDoorPosition() ;
    int x = 0 ;
    int y = 0 ;
    
    switch (wall)
    {
      case Room.NORTH :
        x = position ;
        y = 0 ;
        break ;
        
      case Room.EAST :
        x = room.getRoomSizeX()-1 ;
        y = position ;
        break ;
        
      case Room.SOUTH :
        x = position ;
        y = room.getRoomSizeY()-1 ;
        break ;
      
      case Room.WEST :
        x = 0 ;
        y = position ;
        break ;
    }
    
    if ((xpos == x) && (ypos == y))
    {
      return true ;
    }
    else
    {
      return false ;
    }
  }
  
  public void done()
  {
    room.setRobotColour(Color.green) ;
  }
  
  public void setSpeed(double seconds)
  {
    speed = (int)(seconds * 1000) ;
  }
  
  public boolean atWidget()
  {
    return room.isWidgetAt(xpos,ypos) ;
  }
  
  public void pickUpWidget()
  {
    if (atWidget() && !hasWidget)
    {
      hasWidget = true ;
      room.getWidget(xpos,ypos) ;
    }
    else
    {
      room.beep() ;
    }
  }
  
  public void dropWidget()
  {
    if (hasWidget)
    {
      room.setWidget(xpos,ypos) ;
      hasWidget = false ;
    }
    else
    {
      room.beep() ;
    }
  }
  
  private void pause()
  {
    try
    {
      Thread.sleep(speed) ;
    }
    catch (InterruptedException e)
    {
    }
  }
}