// player.cpp

#include "player.h"

namespace Seahunt
{

  //---------------------------------------------------------------------------
  Player::Player()
  {
    score_value = 0;
    number_tries = 0;
    number_hits = 0; 
    set_name();
    begin();  
    #ifdef PLAYER_TEST
      std::cout << "Constructed Player: " << name << std::endl;
    #endif
  }

  //---------------------------------------------------------------------------
  Player::Player(const std::string& label )
  {
    std::string prompt = label + " Player's Name";
    reset();
    Utility::entry(prompt, name);
    begin();
    #ifdef PLAYER_TEST
      std::cout << "Constructed Player: " << name << std::endl;
    #endif
  }

  //---------------------------------------------------------------------------
  Player::~Player()
  {
    // no dynamic memory allocated by the object
    #ifdef PLAYER_TEST
      std::cout << "Destructed Player: " << name << std::endl;
    #endif
  }

  //---------------------------------------------------------------------------
  void Player::reset(void)
  {
    score_value = 0;
    number_tries = 0;
    number_hits = 0;
  } 

  //-----------------------------------------------------------------------
  int Player::begin(void)
  {
    begin_time = time(0);
    return static_cast<int>(begin_time);
  }

  //-----------------------------------------------------------------------
  int Player::elapsed(void) const
  {
    time_t elapsed_value = time(0) - begin_time;
    return static_cast<int>(elapsed_value);
  }

  //---------------------------------------------------------------------------
  bool 
  Player::hit(Ocean* ocean)
  {
    bool status = ocean->hit();
    
    number_tries++;
    
    if (status)
    {
      number_hits++;
    }

    number_kills = ocean->get_destroyed_targets();

    score(ocean);

    return status;
  }
  
  //---------------------------------------------------------------------------
  void Player::place_targets(Ocean* ocean) const
  {
    ocean->place_target();
  }

  //---------------------------------------------------------------------------
  int 
  Player::score(Ocean* ocean)
  {
    score_value = (number_kills * 100) +
      (number_hits * 10) - number_tries - elapsed();
    return score_value;
  }

  //---------------------------------------------------------------------------
  void 
  Player::show(void) const
  {
    std::cout << "\nPlayer            : " << name << std::endl;
    std::cout << "Elapsed Time      : " << elapsed() << std::endl;
    std::cout << "Number of Attempts: " << number_tries << std::endl;
    std::cout << "Number of Hits    : " << number_hits << std::endl;
    std::cout << "Score             : " << score_value << "\n" << std::endl;
    Utility::wait();
  }

  //---------------------------------------------------------------------------
  int 
  Player::get_score(void) const
  {
    return score_value;
  }

  //---------------------------------------------------------------------------
  int 
  Player::get_number_hits(void) const
  {
    return number_hits;
  }

  //---------------------------------------------------------------------------
  int 
  Player::get_number_tries(void) const
  {
    return number_tries;
  }

  //---------------------------------------------------------------------------
  const std::string& 
  Player::get_name(void) const
  {
    return name;
  }

  //---------------------------------------------------------------------------
  void 
  Player::set_name(const std::string& n )
  {
    name = n;
  }

  //---------------------------------------------------------------------------
  void 
  Player::set_name( void )
  {
    Utility::entry("Player Name", name);
  }

}  // namespace

//-----------------------------------------------------------------------------
#ifdef PLAYER_TEST
int
main ( void )
{
  Seahunt::Ocean ocean;

  Seahunt::Player placer("Placing");
  Seahunt::Player chooser( "Choosing" );

  placer.place_targets(&ocean);

  while (chooser.elapsed() < 600 &&
    ocean.get_active_targets() > 0)
  {
    if (chooser.hit(&ocean))
    {
      chooser.show();
    }
  }

  chooser.show();
  ocean.show();

  return(0);
}
#endif

  

  



